如何将 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 数据库。如果您使用的是其他数据库类型,则可能需要进行一些修改。为确保答案与您的数据库类型相匹配,请在您的问题中对其进行标记。
我正在寻找一种方法来编写 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 数据库。如果您使用的是其他数据库类型,则可能需要进行一些修改。为确保答案与您的数据库类型相匹配,请在您的问题中对其进行标记。