CASE的SUM计数SQL GROUP BY中的重复行

时间:2018-11-28 19:47:34

标签: sql-server sum case

我正在尝试对符合特定条件的所有商品进行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的计数,但验证会说3,因为1的ID由于执行了JOIN而出现了两次

2 个答案:

答案 0 :(得分:0)

如果您认为合适,可以编辑此临时表代码。

   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

答案 1 :(得分:-1)

疯狂猜测

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以及是否经过验证的标志。