SQL服务器:每行最多几列的列名

SQL Server : column name of max of several columns for each row

我有一个名为 campaigns 的 table,它显示每个类别 'tiles' 在电子邮件活动中显示的数量,如下所示

    campaign_id     categoryA_tiles   categoryB_tiles   categoryC_tiles ... cateogory Z_tiles
        1               5                7                    4         ...      4
        2               4                4                    9         ...      1

我需要向此 table 添加 3 列,以显示每个电子邮件活动的 3 个最常出现的类别(即列名称)。例如我希望结果看起来像这样

campaign_id ...  category_1    category_2    category_3
    1       ...   categoryB    categoryA     categoryZ
    2       ...   categoryC    categoryA     categoryB

请注意,第二行可能会有联系,在这种情况下,我希望它们从左到右显示。

这与我所追求的 this question but I'm using SSMS 2012 rather than MySQl. This answer 基本相同,但它与 SSMS 不兼容。具体来说,我无法修复的错误是 @rownum 的定义和使用方式。

有人能帮忙吗?

SQL 服务器和其他服务器之间的语法不一样(尤其是行号 - 请参阅 ROW_NUMBER 的文档)。

试试这个:

DECLARE @campaigns TABLE (campaign_id int, categoryA_tiles int, categoryB_tiles int,  categoryC_tiles int, categoryZ_tiles int)

INSERT INTO @campaigns VALUES
(1,5,7,4,4),
(2,4,4,9,1),
(3,2,5,9,10),
(4,1,8,9,11)

SELECT
  t2.campaign_id,
  max(case when t2.RowNumber=1 then t2.name end) as 'highest value',
  max(case when t2.RowNumber=2 then t2.name end) as '2nd highest value',
  max(case when t2.RowNumber=3 then t2.name end) as '3rd highest value',
  max(case when t2.RowNumber=4 then t2.name end) as '4th highest value'
FROM 
    (SELECT campaign_id, name, amt,  ROW_NUMBER() OVER (PARTITION BY campaign_id ORDER BY amt DESC) AS RowNumber 
      FROM 
        (SELECT campaign_id, categoryA_tiles AS amt, 'categoryA_tiles' AS name FROM @campaigns UNION 
         SELECT campaign_id, categoryB_tiles AS amt, 'categoryB_tiles' AS name FROM @campaigns UNION
         SELECT campaign_id, categoryC_tiles AS amt, 'categoryC_tiles' AS name FROM @campaigns UNION
         SELECT campaign_id, categoryZ_tiles AS amt, 'categoryZ_tiles' AS name FROM @campaigns) t1) t2 
GROUP BY t2.campaign_id

答案将是:

campaign_id    highest value       2nd highest value    3rd highest value   4th highest value
    1          categoryB_tiles     categoryA_tiles      categoryC_tiles     categoryZ_tiles
    2          categoryC_tiles     categoryA_tiles      categoryB_tiles     categoryZ_tiles
    3          categoryZ_tiles     categoryC_tiles      categoryB_tiles     categoryA_tiles
    4          categoryZ_tiles     categoryC_tiles      categoryB_tiles     categoryA_tiles

您好,您可以使用 UNPIVOT 解决此问题,请尝试以下脚本

DECLARE @campaigns TABLE (campaign_id int, categoryA_tiles int, categoryB_tiles int,  categoryC_tiles int, categoryZ_tiles int)

INSERT INTO @campaigns VALUES (1,5,7,4,4),(2,4,4,9,1)

SELECT T.campaign_id,
        MAX((CASE WHEN RowNumber=1 THEN [tVal] END)) AS Category1,
        MAX((CASE WHEN RowNumber=2 THEN [tVal] END)) AS Category2,
        MAX((CASE WHEN RowNumber=3 THEN [tVal] END)) AS Category3
FROM    (
    SELECT campaign_id,tVal,MaxVal,ROW_NUMBER() OVER (PARTITION BY campaign_id ORDER BY MaxVal DESC) AS RowNumber
    FROM @campaigns t1
    UNPIVOT ( MaxVal FOR tVal IN ( categoryA_tiles, categoryB_tiles, categoryC_tiles ,categoryZ_tiles) ) AS u
)   T
GROUP BY T.campaign_id

在这里,您可以根据您的要求 add/remove 更多 column/category(或者可以加入表 - 活动或其他表 - 以获得额外的列)。

结果:

campaign_id Category1       Category2       Category3
1           categoryB_tiles categoryA_tiles categoryC_tiles
2           categoryC_tiles categoryA_tiles categoryB_tiles