Несколько столбцов в одной и той же таблице объединены в один столбец - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь объединить несколько столбцов в одну строку, используя приведенный ниже код.

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

Проблема заключается в том, что запрос создает дубликаты.Я думаю, что проблема в TotalProgress в операторе select.Можно ли как-то устранить дубликаты в запросе?Я использую 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

Как вы можете видеть.Вы заметите, что прогресс только в другом.Я пытался использовать разные, но это не работает.В некоторых случаях все строки в общем прогрессе равны 0. Но в общем, я хочу, чтобы это было так.

JoinDate    | Section | UserName | TotalProgress
2019-01-03  | 1A      | test1    | 22
2019-01-03  | 2B      | test2    | 33
2019-01-03  | 3C      | test3    | 1

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вы не должны использовать 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 - просто получить максимальное значение из трех столбцов.

0 голосов
/ 04 января 2019

Вы принимаете Union 3 раза и, следовательно, поступают аналогичные записи с другим TotalProgress.Кажется нормальнымЧто вы хотите - поместить все 3 строки как 3 столбца в одну строку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...