【问题标题】:Multiple columns in same and Different table combined into one single column同一表和不同表中的多列合并为一列
【发布时间】: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


【解决方案1】:

您不应该将union 用于此逻辑。我想你想要这样的东西:

select A.CreateDate as JoinDate, B.Section, C.UserName,
       bd.TotalProgress
from B join
     C
     on B.UserName = C.UserName join
     A
     on C.UserId = A.UserId left join
     D 
     on C.UserName = D.UserName outer apply
     (select max(TotalProgress) as TotalProgress
      from (values (B.TotalProgress ), (B.TotalProgress_A), (D.TotalProgress )
           ) v(TotalProgress)
     ) bd
where A.[CreateDate] >= '2018-01-01' and
      A.[CreateDate]) < '2019-01-01'  -- guessing you don't really want any data from 2019

outer apply的目的只是为了获取三列的最大值。

【讨论】:

  • 感谢您的帮助和解释。
【解决方案2】:

您参加了 3 次 Union,因此具有不同 TotalProgress 的类似记录即将到来。看起来很正常。 您想要什么 - 将所有 3 行作为 3 列放在一行中?

【讨论】:

  • 下面有第二张表。我希望它是那样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2014-10-04
  • 2020-07-11
  • 2013-11-13
  • 2018-07-05
  • 1970-01-01
  • 2016-05-24
相关资源
最近更新 更多