代码之家  ›  专栏  ›  技术社区  ›  Gargoyle

SQL Group By中重复行的大小写合计

  •  0
  • Gargoyle  · 技术社区  · 6 年前

    我想做一个 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 在那里。然而,我的 最后是1500个。这是因为当我做 JOIN 行被重复多次,因此 每一个都在计数。

    我如何才能这样做一个和/格,但要确保它只适用于不同的行?

    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 由于执行联接而出现两次

    2 回复  |  直到 6 年前
        1
  •  0
  •   junketsu    6 年前

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

       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
    
        2
  •  -1
  •   JamieD77    6 年前

    瞎猜

    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
    

    应该为您提供distinct space.id和一个标志,以确定它是否有效。