我如何跨行合并以删除TSQL中的null ?



我正在使用Azure SQL数据库。我在下面的结构中有一个表,用于跟踪哪些人在不同的时间在不同的岗位上工作。提供简化版本:

CREATE TABLE PersonWorkload
(
WorkloadID INT PRIMARY KEY IDENTITY,
Post VARCHAR(30),
Period VARCHAR(12),
PersonID INT,
GroupID INT,
Notes VARCHAR(100)
)

这里有一个数据样本

INSERT INTO PersonWorkload (Post, Period, PersonID, GroupID, Notes)
VALUES 
('Group Leader', 'Q1', 1, 1, NULL),
('Group Leader', 'Q2', 1, 1, NULL),
('Group Leader', 'Q3', 1, 2, NULL),
('Group Leader', 'Q4', 1, 2, NULL),
('Security', 'Q1', 3, 3, NULL),
('Security', 'Q2', 3, 3, NULL),
('Security', 'Q3', 4, 4, NULL),
('Security', 'Q4', 4, 4, NULL),
('Team member', 'Q1', 7, 5, NULL),
('Team member', 'Q2', 7, 5, 'Leaving programme this qtr'),
('Team member', 'Q3', 13, 6, NULL),
('Team member', 'Q4', 13, 6, NULL),
('Team member', 'Q1', 8, 7, NULL),
('Team member', 'Q2', 8, 7, NULL),
('Team member', 'Q3', 8, 7, NULL),
('Team member', 'Q4', 8, 7, NULL),
('Team member','Q1',9,8,'Temp posting'),
('Team member', 'Q2', 10, 9, NULL),
('Team member', 'Q3', 10, 9, NULL),
('Team member', 'Q4', 10, 9, NULL),
('Comms','Q2',11,10,NULL),
('Comms','Q3',11,10,NULL),
('Comms','Q4',11,10,NULL)

使用GroupID列是因为有时我需要一起处理一组这些帖子。新上任的人总是会触发一个新的群组,但有时一个人可以在一个职位上呆更长的时间,那段时间呢有时可以包含多个组名(所以如果一个人在一个职位上工作了一年,可能是一月到六月?有一个GroupID,七月到十二月有一个不同的GroupID)。

有时只有一个人同时担任一个职位,有时不止一个,有时没有人担任一个职位。

我需要旋转这些信息,以便为每个时期显示一列,以及谁在每个岗位上工作。每篇文章可能有一行或多行。

我已经创建了一个SQL PIVOT查询来实现这一点,并将结果放入一个临时表中。

下面是一个临时表的示例:

CREATE TABLE SampleData (
Post VARCHAR(100)
,GroupID INT
,[Q1] INT
,[Q2] INT
,[Q3] INT
,[Q4] INT
)

…以及填充它的语句:

INSERT INTO SampleData
SELECT * 
FROM
(SELECT Post, Period, PersonID, GroupID
FROM PersonWorkload) t
PIVOT 
(MAX(t.PersonID)
FOR t.Period IN ([Q1],[Q2],[Q3],[Q4])
) pvt

如果我包含groupID,我最终得到的数据来自我的PIVOT查询,看起来像这样:

Q3第四季度13团队成员团队成员团队成员团队成员空团队成员10

正如@lptr在评论中提到的:

您可以向数据透视添加行编号列,以确保不合并唯一的行。

SELECT * 
FROM (
SELECT
Post,
Period,
PersonID,
dense_rank() over (partition by Post, Period order by GroupID, PersonID) as rn
FROM PersonWorkload
) t
PIVOT 
(MAX(t.PersonID)
FOR t.Period IN ([Q1],[Q2],[Q3],[Q4])
) pvt;

,db&lt的在小提琴

ROW_NUMBER()也应该在这里工作

相关内容

  • 没有找到相关文章

最新更新