[英]Pivoting data based on multiple columns
I wonder if it is possible to pivot the following table: 我想知道是否可以透视下表:
10 A ddd
24 B fff
34 B ddd
12 A ddd
I need to pivot it like this 我需要像这样旋转
A B text
-- -- ----
22 34 ddd
0 24 fff
You can use the PIVOT
function for this: 您可以为此使用PIVOT
功能:
select IsNull(A, 0) A,
IsNull(B, 0) B,
txt
from
(
select num, let, txt
from yourtable
) src
pivot
(
sum(num)
for let in (A, B)
) piv
See SQL Fiddle with Demo 参见带有演示的SQL Fiddle
If your values are known, then you can hard-code them similar to the query above. 如果您的值已知,则可以像上面的查询一样对它们进行硬编码。 But if you have an unknown number of values, then you can use dynamic sql to create the query string. 但是,如果您有未知数量的值,则可以使用动态sql创建查询字符串。 Your dynamic sql code would look like this: 您的动态sql代码如下所示:
DECLARE @cols AS NVARCHAR(MAX),
@colsNull AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Let)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colsNull = STUFF((SELECT distinct ',IsNull(' + QUOTENAME(Let)+', 0) as '+QUOTENAME(Let)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @colsNull + ', txt from
(
select num, let, txt
from yourtable
) x
pivot
(
sum(num)
for let in (' + @cols + ')
) p '
execute(@query)
See SQL Fiddle with Demo 参见带有演示的SQL Fiddle
The result of both queries is: 这两个查询的结果是:
| A | B | TXT |
-----------------
| 22 | 34 | ddd |
| 0 | 24 | fff |
Oracle query: Oracle查询:
SELECT NVL(DECODE(area, 'A', total), 0) A
, NVL(DECODE(area, 'B', total), 0) B
, val
FROM
(
SELECT area, SUM(id) total, val
FROM stack_test
GROUP BY area, val
)
/
A B VAL
-- -- --
0 24 fff
22 0 ddd
0 34 ddd
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.