好的我有这样的声明:
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而不是根本没有?
答案 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