简体   繁体   English

基于多列透视数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM