如何基于主键sql从所有列获取唯一值

时间:2017-11-23 10:08:50

标签: sql loops primary-key

我希望在每个主键(本例中为A)上对表进行子集化,然后为每个剩余列获得快速分布(在这种情况下,COL1:2T,1Y,1E和COL2:3Z,1B ),然后重复每个主键。

P   C1  C2
A   T   Z
A   T   Z
A   Y   Z
A   E   B
B   W   M
B   W   M

这可以在SQL中做(我目前使用的是WPS SQL)吗?是否可以遍历每个主键,然后查看结果,以获得以下内容:

P C1       C2
A 2T,1Y,1E 3Z,1B
B 2W       2M
...

请注意,我的数据有~10k个唯一主键和180列

1 个答案:

答案 0 :(得分:0)

你可以使用它。

DECLARE @Temp TABLE (P VARCHAR(5),  C1  VARCHAR(5), C2 VARCHAR(5))
INSERT INTO @Temp VALUES
('A','T','Z'),
('A','T','Z'),
('A','Y','Z'),
('A','E','B'),
('B','W','M'),
('B','W','M')


SELECT T.P, 
    STUFF(X1.C1,1,1,'') C1, 
    STUFF(X2.C2,1,1,'') C2 
FROM 
    (SELECT DISTINCT P FROM @Temp) AS T
    CROSS APPLY (SELECT ',' + CONVERT(VARCHAR,COUNT(*)) + C1  
                    FROM @Temp T1 
                    WHERE T.P = T1.P 
                    GROUP BY C1 
                    ORDER BY COUNT(*) DESC
                    FOR XML PATH('')) AS X1 (C1)
    CROSS APPLY (SELECT ',' + CONVERT(VARCHAR,COUNT(*)) + C2  
                    FROM @Temp T2 
                    WHERE T.P = T2.P 
                    GROUP BY C2 
                    ORDER BY COUNT(*) DESC
                    FOR XML PATH('')) AS X2 (C2)

结果

P     C1             C2        
----- -------------- ----------
A     2T,1Y,1E       3Z,1B
B     2W             2M