Sql 即使条件不存在,如何显示行
我是SQL新手,需要你的帮助 我想选择范围为201801-201804的YM yearmonth列中的所有行,即使条件001在某些月份不存在 表11: 我用了这个:Sql 即使条件不存在,如何显示行,sql,sql-server-2014,Sql,Sql Server 2014,我是SQL新手,需要你的帮助 我想选择范围为201801-201804的YM yearmonth列中的所有行,即使条件001在某些月份不存在 表11: 我用了这个: SELECT YM,code,hour FROM pod11 WHERE YM >= '201801' AND YM <= '201804' and code = '001' GROUP by YM,code,hour ORDER BY YM 有没有关于如何编写查询以实现此目的的建议 YM code hour
SELECT YM,code,hour
FROM pod11
WHERE YM >= '201801' AND YM <= '201804' and code = '001'
GROUP by YM,code,hour
ORDER BY YM
有没有关于如何编写查询以实现此目的的建议
YM code hour
------------------------------------
201801 001 112
201802 001 64
201803 0 0
201804 0 0
一种选择是使用联合为没有匹配代码记录的月份引入记录。在我的输出中,有201712的数据,因为您没有指定它不应该出现的原因,并且它没有匹配的代码数据。如果您不希望该记录出现在其中,那么在WHERE子句中删除它就足够简单了 MSSQL: 演示: MySQL: 演示:
您可以将表连接到自身:
select p1.YM
,coalesce(p2.code,'0') as code
,coalesce(p2.hour,'0') as hour
from pod11 As p1
left join pod11 As p2
on p2.YM = p1.YM
and p2.code = p1.code
where p1.YM between '201801' and '201804'
and coalesce(p2.code,'0') in ('0', '001')
您可以将年份存储在不同的表中并从中进行查询,或者如果您知道pod11表(即201801到201804)中会有所有年份,那么您可以使用范围和不同的表进行查询。我想知道这是否可以在没有子查询的情况下完成。我认为可以是:
select top (1) with ties YM,
(case when code = '001' then hour else 0 end) as code,
(case when code = '001' then code else 0 end) as hour
from pod11
where YM between '201801' and '201804'
order by rank() over (partition by ym
order by (case when code = '001' then 1 else 2 end),
(case when code <> '001' then hour end)
)
您使用的是哪种数据库系统?右键连接日历表。当不涉及聚合函数时,为什么按分组?只需选择DISTINCT即可删除重复项。您使用的是哪种?SQL只是一种查询语言,而不是特定数据库产品的名称。请为使用postgresql、oracle、sql server、db2的数据库产品添加一个标记……我使用的是sql server 2014……就是它!非常感谢你!还有一个问题。有可能看到零而不是没有小时和代码的空字段吗?@Slavce。实际上,这个版本很容易。只需将else添加到select中的case表达式中。
SELECT YM, code, hour
FROM pod11
WHERE YM BETWEEN '201801' AND '201804' AND code = '001'
GROUP BY YM, code, hour
UNION ALL
SELECT DISTINCT t1.YM, 0, 0
FROM pod11 t1
WHERE NOT EXISTS (SELECT 1 FROM pod11 t2 WHERE t1.YM = t2.YM AND t2.code = '001')
ORDER BY YM;
SELECT
tableYM.YM,
ISNULL(pod11.code, 0) AS code,
ISNULL(SUM(pod11.hour), 0) AS hour
FROM (
SELECT DISTINCT YM FROM pod11 WHERE YM >= '201801' AND YM <= '201804'
) tableYM LEFT JOIN pod11 ON tableYM.YM = pod11.YM AND pod11.code = '001'
GROUP BY pod11.code, tableYM.YM
ORDER BY tableYM.YM
SELECT
tableYM.YM,
IFNULL(pod11.code, 0) AS code,
IFNULL(SUM(pod11.hour), 0) AS hour
FROM (
SELECT DISTINCT YM FROM pod11 WHERE YM >= '201801' AND YM <= '201804'
) tableYM LEFT JOIN pod11 ON tableYM.YM = pod11.YM AND pod11.code = '001'
GROUP BY pod11.code, tableYM.YM
ORDER BY tableYM.YM
select p1.YM
,coalesce(p2.code,'0') as code
,coalesce(p2.hour,'0') as hour
from pod11 As p1
left join pod11 As p2
on p2.YM = p1.YM
and p2.code = p1.code
where p1.YM between '201801' and '201804'
and coalesce(p2.code,'0') in ('0', '001')
SELECT YM, COALESCE(code,0) code, COALESCE(hour,0) hour
(
SELECT YM,code,hour
FROM pod11
WHERE YM >= '201801' AND YM <= '201804' and code = '001'
GROUP by YM,code,hour
RIGHT JOIN
(SELECT 201801 as YM
UNION
SELECT 201802
UNION
SELECT 201803
UNION
SELECT 201804
) as t
ON pod11. YM = t.YM
)
ORDER BY YM
select top (1) with ties YM,
(case when code = '001' then hour else 0 end) as code,
(case when code = '001' then code else 0 end) as hour
from pod11
where YM between '201801' and '201804'
order by rank() over (partition by ym
order by (case when code = '001' then 1 else 2 end),
(case when code <> '001' then hour end)
)