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
我有一个名为 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