MSSQL 在列中显示垂直数据
MSSQL Display Vertical Data in Columns
好的,我已经解决了一半的问题,我相信我需要帮助解决另一半。我能够从一列 (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
如果当前数据集示例是您语句的结果,这应该很容易。我将通过在已声明的 table 变量中创建类似的数据集来 模拟 您的查询。只需将 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)
好的,我已经解决了一半的问题,我相信我需要帮助解决另一半。我能够从一列 (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
如果当前数据集示例是您语句的结果,这应该很容易。我将通过在已声明的 table 变量中创建类似的数据集来 模拟 您的查询。只需将 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)