SUM with CASE подсчитывает повторяющиеся строки в SQL GROUP BY - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь сделать SUM против всех предметов, которые соответствуют определенному условию, например так:

SELECT l.Building_Name, 
       SUM(CASE WHEN s.Date >= '20180930' THEN 1 ELSE 0 END) Validated,
       COUNT(DISTINCT s.id) Total
FROM Lab_Space s
JOIN Locations l ON s.Building_Code = l.Building_Code
GROUP BY l.Building_Name

Правильно COUNT, и скажу что-то вроде 20, потому что яможно поставить DISTINCT s.id там.Тем не менее, мой SUM заканчивается примерно как 1500. Это потому, что когда я делаю, JOIN строки дублируются несколько раз, и, таким образом, SUM рассчитывает против каждой.

Как я могусделать SUM / CASE, как это, но удостовериться, что он применяется только к отдельным строкам?

s.id    l.building_name  s.date
1       JF               2018-11-10
1       JF               2018-11-10
2       JF               2018-12-12

Так что, если у меня есть такие данные, я собираюсь получить мой счет правильно из 2, но validate скажет3 потому что идентификатор 1 появляется дважды из-за выполнения JOIN

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

дикое предположение

select      l.Building_Name
            , count(s.Id)
            , sum(s.Validated)
from        Locations          l
cross apply (   select      s.Id
                            , max(case
                                      when s.Date >= '20180930' then 1
                                  else 0
                                  end) as Validated
                from        Lab_Space s
                where       s.Building_Code = l.Building_Code
                group by    s.Id) s
group by l.Building_Name

должно дать вам отдельный space.id и флаг, будет ли он проверен.

0 голосов
/ 28 ноября 2018

Вы можете редактировать этот код временной таблицы, если сочтете нужным.

   create table #temp_Lab_Space
    ([Date] date null
    ,Building_Code  int null

    )

    create table #temp_Locations 
    ( Building_Code  int null
    ,Building_Name varchar(10) null
    )


        insert into #temp_Lab_Space values
        ('2018-11-10',1)
        ,('2018-11-10', 1)
        ,('2018-12-12' , 1)

        insert into #temp_Locations values
        (1, 'JF')


select Building_Name, 
       SUM(CASE WHEN Date >= '20180930' THEN 1 ELSE 0 END) Validated,
       COUNT(DISTINCT Building_Code) Total
from (
select  distinct l.Building_Name, s.Building_Code, s.Date
,Rank_1 = rank() over(partition by l.Building_Name order by s.Date asc)
FROM #temp_Lab_Space s
JOIN #temp_Locations l ON s.Building_Code = l.Building_Code
) a
group by Building_Name
...