mysql unpivot_SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子...

使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UNPIVOT,则可以很容易的实现行列转换的需求。

在本文中我们将通过两个简单的例子详细讲解PIVOT和UNPIVOT的用法。

PIVOT是行转列,用法如下:

假如表结构如下:

id  name quarter  profile

1     a        1         1000

1     a        2         2000

1     a        3         4000

1     a        4         5000

2     b        1         3000

2     b        2         3500

2     b        3         4200

2     b        4         5500

----------------------------------------------

使用PIVOT将四个季度的利润转换成横向显示:

select id,name,

[1] as "一季度",[2] as "二季度",[3] as "三季度",[4] as "四季度"

from test

pivot

(

sum(profile)

for quarter in ([1],[2],[3],[4])

)

as pvt

-----------------------------------------------

得出的结果如下:

id  name   一季度  二季度  三季度  四季度

1     a         1000    2000     4000     5000

2     b         3000    3500     4200     5500

========================================================================================

UNPIVOT是列转行,用法如下:

假如表结构如下:

id   name    Q1        Q2       Q3        Q4

1      a       1000    2000    4000     5000

2      b       3000    3500    4200     5500

-----------------------------------------------

使用UNPIVOT,将同一行中四个季度的列数据转换成四行数据:

select id,name,quarter,profile

from test

unpivot

(

profile

for quarter in ([Q1],[Q2],[Q3],[Q4])

)

as unpvt

-----------------------------------------------

得出的结果如下:

id   name   quarter    profile

1       a         Q1        1000

1       a         Q2        2000

1       a         Q3        4000

1       a         Q4        5000

2       b         Q1        3000

2       b         Q2        3500

2       b         Q3        4200

2       b         Q4        5500

------------------------------------------------------------------------------

设存在如下纵向表,第一列为id(可能是某个业务数据的id),第二列为类型,第三列为类型对应的值,如下图:

8103616b7daf75c071a9f818ef86cf4e.png

如上表,存在2,3,4三种类型,其中业务数据ID为1的三种类型都有值,业务数据ID为2的三种类型都有值,业务数据ID为3的只有类型2和3有值,现在要把纵向表横过来显示,可以采用如下代码:

-- =========================================================

-- 纵向表变横向表:

-- 1. 转换类型,类型的值必须是整数,且不等于0,即0没有意义,0可以表示为空

-- =========================================================

SELECT

t.id,

SUM(DECODE(t.code, 2, 2, 0)) "第二项", -- 如果该行类型为2则就是2,其它的都为0

SUM(DECODE(t.code, 3, 3, 0)) "第三项",

SUM(decode(t.code, 4, 4, 0)) "第四项"

FROM ttt t WHERE t.id=1 GROUP BY t.id;

-- =========================================================

-- 纵向表变横向表:

-- 1. 转换类型对应的数据,且数据需要是数值,且0没有意义,即0可以表示为空

-- =========================================================

SELECT

t.id,

SUM(DECODE(t.code, 2, t.val, 0)) "第二项", -- 如果该行类型为2则显示2类型对应的值DECODE,否则都显示0

SUM(DECODE(t.code, 3, t.val, 0)) "第三项",

SUM(DECODE(t.code, 4, t.val, 0)) "第四项"

FROM ttt t GROUP BY t.id;

----------------------------------------------------------------------------------------------------------------------------------------

oracle合并列的函数wm_concat的使用详解

oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oracle wm_concat(column)函数实现字段合并,如果您对oracle wm_concat(column)函数使用方面感兴趣的话,不妨一看。

shopping:-----------------------------------------

u_id       goods            num

------------------------------------------

1                苹果                2

2                 梨子               5

1                 西瓜               4

3                 葡萄               1

3                香蕉                1

1               橘子                 3

=======================

想要的结果为:--------------------------------

u_id          goods_sum

____________________

1              苹果,西瓜,橘子

2              梨子

3              葡萄,香蕉

---------------------------------

1.select u_id, wmsys.wm_concat(goods) goods_sum  2. 3.from shopping  4. 5.group by u_id

想要的结果2:

--------------------------------

u_id          goods_sum

____________________

1              苹果(2斤),西瓜(4斤),橘子(3斤)

2              梨子(5斤)

3              葡萄(1斤),香蕉(1斤)

---------------------------------

使用oracle wm_concat(column)函数实现:select u_id, wmsys.wm_concat(goods || '(' || num || '斤)' ) goods_sum

from shopping

group by u_id

mysql---group_concat

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值