Sql 即使条件不存在,如何显示行

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

我是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   
------------------------------------
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)
                     )