如何将 SQL 语句写入 select 以获取一年中每个月的数据?

How to write SQL statement to select for data broken up for each month of the year?

我正在寻找一种方法来编写 SQL 语句,分别为一年中的每个月选择数据。

在下面的 SQL 语句中,我试图计算 TOTAL_PRECIP_IN 和 TOTAL_SNOWFALL_IN 列中任一列大于 0 的实例数。在我的数据中 table,我有一年中每一天的这两列(“TOTAL_PRECIP_IN”和“TOTAL_SNOWFALL_IN”)的信息(总共 365 个条目)。

我想按每个日历月拆分我的数据,但不确定执行此操作的最佳方法。在下面的语句中,我使用 UNION 语句来拆分一月和二月。如果我在一年中剩下的几个月里继续使用 UNION 语句,我就能得到我要找的答案。但是,使用11个不同的UNION语句并不是最优解。

任何人都可以给我一个建议,我可以如何编辑我的 SQL 语句来衡量一年中每个月从每月的第一天到最后一天?

select monthname(OBSERVATION_DATE) as "Month", sum(case when TOTAL_PRECIP_IN or TOTAL_SNOWFALL_IN > 0 then 1 else 0 end) AS "Days of Rain" from EMP_BASIC
    where OBSERVATION_DATE between '2019-01-01' and '2019-01-31'
    and CITY = 'Olympia'
    group by "Month"
UNION
select monthname(OBSERVATION_DATE) as "Month", sum(case when TOTAL_PRECIP_IN or TOTAL_SNOWFALL_IN > 0 then 1 else 0 end) from EMP_BASIC
    where OBSERVATION_DATE between '2019-02-01' and '2019-02-28'
    and CITY = 'Olympia'
    group by "Month"```

您的 table 结构太不清楚,无法告诉您您需要的确切查询。但一个普遍的简单想法是构建您的值的总和,然后按月份按月份名称 and/or 分组。因为你写了你只想要大于 0 的总和值,你可以把这个条件放在 where 子句中。所以你的查询将是这样的:

SELECT MONTHNAME(yourdate) AS month, 
MONTH(yourdate) AS monthnr, 
SUM(yourvalue) AS yoursum
FROM yourtable
WHERE yourvalue > 0
GROUP BY MONTHNAME(yourdate), MONTH(yourdate)
ORDER BY MONTH(yourdate);

我在这里创建了一个示例:db<>fiddle

您可能需要根据您的具体目的修改此通用构造(可能需要注意不同的年份、NULL 值等)。请注意,这是 MYSQL 数据库的示例,因为您写了关于 MONTHNAME() 的文章,它在大多数情况下用于 MYSQL 数据库。如果您使用的是其他数据库类型,则可能需要进行一些修改。为确保答案与您的数据库类型相匹配,请在您的问题中对其进行标记。