如何使用查询合并列和行?

时间:2019-08-12 15:32:07

标签: sql sql-server-2014

我需要按GroupName明智地对客户进行分组。客户可以在每个GroupName上重复。每个GroupName在表OCQG中都有一个唯一的编号,称为“ GroupCode”。客户表(OCRD)的每个GroupCode都有单独的列。例如,C-0001客户可以有更多的组名。我们可以通过查看Group1,...,Group64列值(如果该值= Y)来标识每个客户的GroupCode。如果表结构如下,请帮助我。

OCQG表; enter image description here

OCRD表;

enter image description here

2 个答案:

答案 0 :(得分:1)

UNPIVOT可能会帮助...

SELECT p.customerCode, REPLACE(p.groupcode,'GROUP','') groupcode, ocqg.groupname
FROM ocrd UNPIVOT 
    ( value
     FOR groupcode IN ([Group1],[Group2],[Group3], etc...)
     ) as p,
     ocqg
WHERE value = 'Y' and 
ocqg.groupcode = REPLACE(p.groupcode,'GROUP','')
order by p.customerCode

答案 1 :(得分:0)

如果您需要计算每个组中的客户,我建议先使用apply取消透视,然后再使用join

select ocqg.groupname, count(*)
from ocrd cross apply
     (values (ocrd.group1, 1), (ocrd.group2, 2), . . . 
     ) v(val, groupcode) join
     ocqg
     on v.groupcode = ocgq.groupcode
where v.val = 'Y'
group by ocqg.groupname;

请注意,ocrd表的格式非常差。您应该有一个正确的联结/关联表,每个客户和每个组一行。