【发布时间】:2019-01-04 06:04:07
【问题描述】:
我正在尝试使用下面的代码将多列组合成单行。
select A.CreateDate as JoinDate, B.Section, C.UserName, cast(B.TotalProgress as decimal(10,0)) as TotalProgress
from B
join C on B.UserName = C.UserName
join A on C.UserId = A.UserId
WHERE (A.[CreateDate] >= '1/1/2018')
AND ((A.[CreateDate]) <= ('1/1/2019'))
UNION
select A.CreateDate as JoinDate, B.Section, C.UserName, cast(D.TotalProgress as decimal(10,0)) as TotalProgress
from B
join C on B.UserName = C.UserName
join A on C.UserId = A.UserId
join D on C.UserName = D.UserName
WHERE (A.[CreateDate] >= '1/1/2018')
AND ((A.[CreateDate]) <= ('1/1/2019'))
UNION
select A.CreateDate as JoinDate, B.Section, C.UserName, cast(B.TotalProgress_A as decimal(10,0)) as TotalProgress
from B
join C on B.UserName = C.UserName
join A on C.UserId = A.UserId
WHERE (A.[CreateDate] >= '1/1/2018')
AND ((A.[CreateDate]) <= ('1/1/2019'))
order by A.CreateDate desc
问题是查询重复。我认为问题出在 select 语句中的 TotalProgress 。有什么办法可以消除查询中的重复项?我正在使用 SQL Server 2016 Management Studio 运行此查询。
以下是我运行时的查询结果。
JoinDate | Section | UserName | TotalProgress
2019-01-03 | 1A | test1 | 0
2019-01-03 | 1A | test1 | 1
2019-01-03 | 1A | test1 | 22
2019-01-03 | 2B | test2 | 0
2019-01-03 | 2B | test2 | 33
2019-01-03 | 3C | test3 | 0
2019-01-03 | 3C | test3 | 1
如您所见。您会注意到唯一不同的是进度。我试图使用 distinct 但它不起作用。在某些情况下,总进度中的某些行都是 0。但总的来说,我希望它是这样的。
JoinDate | Section | UserName | TotalProgress
2019-01-03 | 1A | test1 | 22
2019-01-03 | 2B | test2 | 33
2019-01-03 | 3C | test3 | 1
【问题讨论】:
-
您确实需要向此问题添加示例数据,以解释感知到的问题是什么,以及您认为需要解决的问题。另外,请定义“重复”的含义。严格来说,上述查询的结果集中不能有任何重复,因为 SQL Server 会过滤掉所有重复记录。
标签: sql sql-server database ssms