具有0条记录的SQL显示案例

时间:2015-11-09 17:43:37

标签: sql-server-2008 tsql

好的我有这样的声明:

select 
CASE    
    WHEN lm.location_name like 'HM%' THEN 'HMO'
    WHEN lm.location_name like 'LS%' or lm.location_name = 'R' THEN 'LSR'
    WHEN lm.location_name like 'SD%' or lm.location_name like 'St%' THEN 'SSO'
    WHEN lm.location_name like 'ME%' THEN 'MV'
END as Office, 
CASE County
    WHEN '1' THEN 'A'
    WHEN '2' THEN 'B'
    WHEN '3' THEN 'B'
    WHEN '4' THEN 'C'
ELSE p.COUNTY END as County,
COUNT(*) as [Count]
from CTE as a
join location_mstr as lm
    on lm.location_id = a.location_id
join person as p
    on p.person_id = a.person_id
where 
ROW = 1
and CONVERT(datetime,a.date) >= CONVERT(datetime,'2015-04-01')
and CONVERT(datetime,a.date) <DATEADD(day,1,CONVERT(datetime,'2015-04-30'))
group by 
CASE    
    WHEN lm.location_name like 'HM%' THEN 'HMO'
    WHEN lm.location_name like 'LS%' or lm.location_name = 'R' THEN 'LSR'
    WHEN lm.location_name like 'SD%' or lm.location_name like 'St%' THEN 'SSO'
    WHEN lm.location_name like 'ME%' THEN 'MV'
END,
CASE County
    WHEN '1' THEN 'A'
    WHEN '2' THEN 'B'
    WHEN '3' THEN 'B'
    WHEN '4' THEN 'C'
ELSE p.COUNTY END
order by Office

这给了我正确的结果。但是,如果结果为零,则可以显示位置名称或县。

例如,如果HMO办公室和B县的组合没有结果仍然显示为HMO | B | 0而不是根本没有?

2 个答案:

答案 0 :(得分:0)

创建包含所有可能结果的CTE。然后LEFT JOIN您对此CTE的查询:

;WITH CTE AS (
   SELECT x.o, y.c
   FROM (VALUES ('HMO'), ('LSR'), ('SSO')) AS x(o)
   CROSS JOIN (VALUES ('A'), ('B'), ('C')) AS y(c)
)
SELECT t1.o AS Office, t2.c AS County, COALESCE(t2.[Count], 0) AS [Count] 
FROM CTE AS t1
LEFT JOIN ( ... your query here ...) AS t2 
ON t1.o = t2.Office AND t1.c = t2.County

如果办公室和县的特定组合(例如('HMO', 'B'))没有结果,则t2.[Count]在上述查询中为NULL,并且0由使用返回COALESCE

答案 1 :(得分:0)

这是在黑暗中拍摄的。如果CTE,location_mstr和person表中的结构和数据可用,我可以提供更好的查询。

总的来说,通过all_office_county CTE,我们正在提取办公室和县的所有可能组合。然后,我们将其作为主要数据集,并使用您在查询中成功获得的结果保持连接。无论我们在哪里找不到匹配项,我们都会使用0作为计数。

with all_office_county as 
(
select
    distinct 
    CASE    
        WHEN lm.location_name like 'HM%' THEN 'HMO'
        WHEN lm.location_name like 'LS%' or lm.location_name = 'R' THEN 'LSR'
        WHEN lm.location_name like 'SD%' or lm.location_name like 'St%' THEN 'SSO'
        WHEN lm.location_name like 'ME%' THEN 'MV'
    END as Office,
    CASE County
        WHEN '1' THEN 'A'
        WHEN '2' THEN 'B'
        WHEN '3' THEN 'B'
        WHEN '4' THEN 'C'
    ELSE p.COUNTY END as County
from CTE a
left join location_mstr as lm on lm.location_id = a.location_id
left join person as p p.person_id = a.person_id
),

main as (
select 
CASE    
    WHEN lm.location_name like 'HM%' THEN 'HMO'
    WHEN lm.location_name like 'LS%' or lm.location_name = 'R' THEN 'LSR'
    WHEN lm.location_name like 'SD%' or lm.location_name like 'St%' THEN 'SSO'
    WHEN lm.location_name like 'ME%' THEN 'MV'
END as Office, 
CASE County
    WHEN '1' THEN 'A'
    WHEN '2' THEN 'B'
    WHEN '3' THEN 'B'
    WHEN '4' THEN 'C'
ELSE p.COUNTY END as County,
COUNT(*) as [Count]
from CTE as a
join location_mstr as lm
    on lm.location_id = a.location_id
join person as p
    on p.person_id = a.person_id
where 
ROW = 1
and CONVERT(datetime,a.date) >= CONVERT(datetime,'2015-04-01')
and CONVERT(datetime,a.date) <DATEADD(day,1,CONVERT(datetime,'2015-04-30'))
group by 
CASE    
    WHEN lm.location_name like 'HM%' THEN 'HMO'
    WHEN lm.location_name like 'LS%' or lm.location_name = 'R' THEN 'LSR'
    WHEN lm.location_name like 'SD%' or lm.location_name like 'St%' THEN 'SSO'
    WHEN lm.location_name like 'ME%' THEN 'MV'
END,
CASE County
    WHEN '1' THEN 'A'
    WHEN '2' THEN 'B'
    WHEN '3' THEN 'B'
    WHEN '4' THEN 'C'
ELSE p.COUNTY END
order by Office
)

select aoc.office, aoc.county, coalesce(m.[Count], 0)
from all_office_county aoc
left join main m on aoc.office = m.office and aoc.county = m.county
相关问题