【问题标题】:SQL group data based on a column and then transpose rows to columns [duplicate]SQL基于列对数据进行分组,然后将行转置为列[重复]
【发布时间】:2020-07-09 09:32:50
【问题描述】:

我正在尝试将我的 SQL 表行转换为列,但我需要根据“测验”列中的组创建结果行。

我已阅读有关将行转换为列的线程,但由于我想要实现的目标涉及对列进行分组,并且我需要使用“分数”列中的所有值,所以我不知道如何实现我想要的结果。

原表:

 Quiz |  Name  |  Score
---------------------------
  A   |  Andy  |  10
  A   |  Drew  |  8
  A   |  Mark  |  7
  A   |  Samm  |  6
  B   |  Andy  |  9
  B   |  Drew  |  7
  B   |  Mark  |  7
  B   |  Samm  |  9

查询结果:

Quiz  |  Andy |  Drew  |  Mark  |  Samm
-----------------------------------------
  A   |   10  |    8   |   7    |  6
  B   |    9  |    7   |   7    |  9

非常感谢任何帮助。

【问题讨论】:

标签: sql sql-server tsql group-by pivot


【解决方案1】:

您可以使用 PIVOT

DECLARE @SampleData TABLE (Quiz VARCHAR(5),   Name  VARCHAR(10),   Score INT)
INSERT INTO @SampleData VALUES
('A', 'Andy', 10),
('A', 'Drew', 8 ),
('A', 'Mark', 7 ),
('A', 'Samm', 6 ),
('B', 'Andy', 9 ),
('B', 'Drew', 7 ),
('B', 'Mark', 7 ),
('B', 'Samm', 9 )


SELECT * FROM @SampleData 
PIVOT ( MAX(Score) FOR Name IN ([Andy], [Drew], [Mark], [Samm])) AS PVT

如果你想让它变得动态,你可以使用动态轴

DECLARE @Columns VARCHAR(MAX) = ''
SELECT @Columns = @Columns + ',' + QUOTENAME( Name ) FROM (SELECT DISTINCT Name FROM SampleData) T
SELECT @Columns = STUFF(@Columns, 1,1,'')

DECLARE @SqlText VARCHAR(MAX) = 'SELECT * FROM SampleData 
PIVOT ( MAX(Score) FOR Name IN ('+ @Columns +')) AS PVT'

EXEC (@SqlText)

结果:

Quiz  Andy        Drew        Mark        Samm
----- ----------- ----------- ----------- -----------
A     10          8           7           6
B     9           7           7           9

【讨论】:

  • 感谢您的及时答复。它确实帮助了我。
  • 不客气!
【解决方案2】:

对于固定的名字列表,可以做条件聚合:

select
    quiz,
    max(case wen name = 'Andy' then score end) Andy,
    max(case wen name = 'Drew' then score end) Drew,
    max(case wen name = 'Mark' then score end) Mark,
    max(case wen name = 'Sam'  then score end) Sam
from mytable
group by quiz

如果您希望根据在表中找到的名称动态生成列,那么纯 SQL 无法做到这一点。您需要动态 SQL(即从表中找到的值构建一个查询字符串,然后执行它)——这是另一个野兽。

【讨论】:

  • 感谢您的回答。是的,我需要动态 SQL,但我可以使用它。我可以即时构建查询字符串。
猜你喜欢
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
相关资源
最近更新 更多