我正在尝试对符合特定条件的所有商品进行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而出现了两次
答案 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以及是否经过验证的标志。