【问题标题】:MSSQL Display Vertical Data in ColumnsMSSQL 在列中显示垂直数据
【发布时间】:2018-09-27 20:21:45
【问题描述】:

好的,我已经解决了一半的问题,我相信我需要帮助解决另一半。我能够从一列 (TEAMS) 中填充几行数据并连接到一列,但是,我似乎需要对同一数据集中的另一列执行相同的操作。

这是当前数据集示例:

FIRST | LAST      | YEAR  | ID  | TEAMS
-- -- -- -- -- -- -- -- -- -- -- -- -- 
Chris | Anderson  | 2015  | 176 | 05 White (B)
Chris | Anderson  | 2016  | 176 | 05 Royal (B)
Chris | Anderson  | 2017  | 176 | 05 Royal (B), '08 Gray (B)
Chris | Anderson  | 2018  | 176 | 05 Royal (B), 08 (B)

我需要将年份 VALUE 作为列名,将团队数据作为 VALUE,如下所示:

FIRST | LAST     | 2015         | 2016         | 2017
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
Chris | Anderson | 05 White (B) | 05 Royal (B) | 05 Royal (B), '08 Gray (B)

这是生成当前(第一个)数据集的现有 SQL 语句。

SELECT DISTINCT TOP 100 PERCENT dbo.Coaches.FirstName, dbo.Coaches.LastName, dbo.Teams.clubYear, dbo.Coaches.CoachID,
STUFF ((   SELECT  ', '+ SUBSTRING(TeamName,14,len(TeamName)) + ' ('+LEFT(gender,1)+')'
         FROM     dbo.Teams ST
         WHERE    ST.CoachID = dbo.Coaches.CoachID AND ST.clubYear = dbo.Teams.clubYear
         ORDER BY clubYear, CoachID
         FOR XML PATH('')), 1, 1, '') AS Teams FROM    dbo.Coaches INNER JOIN
    dbo.Teams  ON dbo.Coaches.CoachID = dbo.Teams.CoachID
WHERE   dbo.teams.teamTypeID = 3
GROUP BY dbo.Coaches.FirstName, dbo.Coaches.LastName, dbo.Teams.clubYear, dbo.Teams.TeamName, dbo.Coaches.CoachID
ORDER BY dbo.Coaches.LastName, dbo.Coaches.FirstName, dbo.Teams.clubYear

【问题讨论】:

  • 什么版本的 SQL Server?发布结果样本非常有帮助。由于它不是特定于 CF 的,请注意将其放入 sqlfiddle.com? :-) 这让其他人更容易协作并帮助您找到答案。
  • 看起来像 PIVOT 表问题。

标签: sql-server tsql coldfusion


【解决方案1】:

如果当前数据集示例是你的语句的结果,这应该是相当容易的。我将通过在声明的表变量中创建类似的数据集来模拟您的查询。只需将 SELECT * FROM @tbl 替换为您的声明即可。

DECLARE @tbl TABLE ([FIRST] VARCHAR(100),[YEAR] INT,TEAMS VARCHAR(100));
INSERT INTO @tbl VALUES
 ('Chris',2015,'White (B)')
,('Chris',2016,'05 Royal (B)')
,('Chris',2017,'05 Royal (B), 08 Gray (B)');

--查询将使用您的数据集并将其发送到PIVOT

SELECT p.*
FROM
(
    SELECT * FROM @tbl
) t
PIVOT
(
    MAX(TEAMS) FOR [YEAR] IN([2015],[2016],[2017])
) p;

结果

FIRST   2015        2016            2017
Chris   White (B)   05 Royal (B)    05 Royal (B), 08 Gray (B)

【讨论】:

  • Shnugo,太棒了,非常感谢!!它完全按照我的意愿工作,但是,我有一个简单的问题。 [YEARS] 是动态的,因为有些人可能在 2009 年到 2018 年和前锋期间拥有球队,而其他人则没有。我如何更新查询以反映这一点?
  • 不幸的是 PIVOT 不支持动态名称。它需要动态sql。请务必阅读有关避免 SQL 注入的帖子。 stackoverflow.com/questions/1439403/…stackoverflow.com/search?q=%5Bsql-server%5D+dynamic+pivot
  • @DavidJacobson 结果集的列必须事先知道。有两种方法: 将所有可能的年份添加到 IN 列表中。这将在任何情况下返回相同的集合,但如果没有值,它将返回 NULL 值。另一个机会是像 Ageax 建议的 动态 SQL。问题是:您如何使用此查询?是为了某种报告吗?中间有表示层吗?人眼不喜欢 empty 年,而应用程序不喜欢不可预测的列名...
猜你喜欢
  • 2014-05-30
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 2022-07-07
相关资源
最近更新 更多