简体   繁体   English

如何在SQL中的两列上使用数据透视

[英]How to use Pivot on two columns in sql

I have data like below in my table. 我的表格中有以下数据。 Flag is bit and label is varchar. 标志位,标签为varchar。

parentid code label  flag
1       abc   hello   false
1       xyz   bye     false
1       qrt   hi      true

I need to fetch the records as 我需要提取记录为

parentid  label_abc flag_abc  label_xyz flag_xyz  label_qrt flag_qrt

I can only fetch only label right now using Pivot, but when i give second aggregate function for flag it gives error (Incorrect syntax near ','.). 我现在只能使用Pivot来获取标签,但是当我为标志提供第二个聚合函数时,它将给出错误(“,”附近的语法不正确)。 Is there any way to fetch two columns using Pivot. 有没有办法使用Pivot来获取两列。

I did something like this: 我做了这样的事情:

SELECT distinct
       parentid     
       , [abc] as label_abc 
       , [xyz] as label_xyz 
       , [qrt] as label_qrt
FROM (
Select 
    parentid,   
    label,code  
FROM items 
   ) a
Pivot ( 
Max(label), max (flag)
FOR code in ([abc], [xyz], [qrt]
   ) as Pvt

I find it a bit tricky to do this using the pivot operator, and a lot easier to use conditional aggregation instead: 我发现使用pivot运算符执行此操作有些棘手,而使用条件聚合则容易得多:

select 
    parentid, 
    max(case when code = 'abc' then label end) as label_abc, 
    max(case when code = 'abc' then flag  end) as flag_abc, 
    max(case when code = 'xyz' then label end) as label_xyz, 
    max(case when code = 'xyz' then flag  end) as flag_xyz, 
    max(case when code = 'qrt' then label end) as label_qrt, 
    max(case when code = 'qrt' then flag  end) as flag_qrt
from ( 
    select parentid, code, label, cast(flag as int) flag 
    from items 
) src
group by parentid;

Sample SQL Fiddle 示例SQL提琴

yes, but they need to be pivoted separately. 是的,但需要分别进行调整。 it takes a little bit of fancy footwork, but it should look more like: 它需要花哨的步法,但看起来应该更像:

select distinct parentid
, [abc1] as label_abc 
, [xyz1] as label_xyz 
, [qrt1] as label_qrt
, [abc2] as flag_abc 
, [xyz2] as flag_xyz 
, [qrt2] as flag_qrt
from (
    select parentid
    , label
    , label + '1' as code1
    , label + '2' as code2
    from items 
) as a
pivot (
    max(label) for code1 in ([abc1], [xyz1], [qrt1])
) as pvt1
pivot (
    max(flag) for code2 in ([abc2], [xyz2], [qrt2])
) as pvt2

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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