sql - 概括 CASE 语句(结果列的动态名称?)
问题描述
我目前有这样的查询-
SELECT
SUM(CASE month WHEN 'January' THEN 1 ELSE 0 END) AS "Jan",
SUM(CASE month WHEN 'February' THEN 1 ELSE 0 END) AS "Feb",
SUM(CASE month WHEN 'March' THEN 1 ELSE 0 END) AS "Mar",
SUM(CASE month WHEN 'April' THEN 1 ELSE 0 END) AS "April",
SUM(CASE month WHEN 'May' THEN 1 ELSE 0 END) AS "May",
SUM(CASE month WHEN 'June' THEN 1 ELSE 0 END) AS "June"
FROM tbl
WHERE start >= '2021-01-01'
AND start <= '2021-06-30'
此查询需要每月运行过去 6 个月。例如,由于当前月份还没有结束,所以这个查询需要从 1 月 1 日到 6 月 30 日运行。如何自动执行这个查询,这样我就不必每个月都更改CASE
语句或子句中的日期。WHERE
我期待的输出
Jan Feb Mar Apr May June
2 2 3 6 1 4
解决方案
从现在的日期返回1
一个月:结果是结束日期:DATEADD(MONTH, -1, GETDATE())
7
几个月后成为开始日期:DATEADD(MONTH, -7, GETDATE())
要计算该月的第一天,请从自身中减去今天:(DAY(CURRENT_TIMESTAMP) - 1)
获取结束日期
sql => select DATEADD(MONTH, -1, GETDATE()) - (DAY(CURRENT_TIMESTAMP) - 1)
postgresql => SELECT now() - INTERVAL '1 month' - (extract(day from now()) - 1 || ' day')::INTERVAL;
获取开始日期
sql => select DATEADD(MONTH, -7, GETDATE()) - (DAY(CURRENT_TIMESTAMP) - 1)
postgresql => select now() - INTERVAL '7 month' - (extract(day from now()) - 1 || ' day')::INTERVAL;
询问
SELECT
SUM(CASE month WHEN 'January' THEN 1 ELSE 0 END) AS "Jan",
SUM(CASE month WHEN 'February' THEN 1 ELSE 0 END) AS "Feb",
SUM(CASE month WHEN 'March' THEN 1 ELSE 0 END) AS "Mar",
SUM(CASE month WHEN 'April' THEN 1 ELSE 0 END) AS "April",
SUM(CASE month WHEN 'May' THEN 1 ELSE 0 END) AS "May",
SUM(CASE month WHEN 'June' THEN 1 ELSE 0 END) AS "June"
FROM dateTable
WHERE start >= now() - INTERVAL '7 month' - (extract(day from now()) - 1 || ' day')::INTERVAL
AND start <= now() - INTERVAL '1 month' - (extract(day from now()) - 1 || ' day')::INTERVAL;
dbfiddle中的 postgresql 演示
推荐阅读
- python - 使用python导出csv文件时如何将cp1252转换为UTF-8
- reactjs - 从另一个减速器更改“加载”状态
- python - 计算机视觉三层RGB
- bootstrap-4 - 动态更改 Bootstrap 4.x Popover 的标题和内容
- android - 是否可以在Android中更改蓝牙传输频率?也许通过NDK?
- testing - Travis-CI 上的 API 请求失败
- android - 如何在 Android 上修复 dalvik.system.BaseDexClassLoader.findClass ClassNotFoundException?
- android - 在我将新版本发布到 jcenter 后,我的 Android 库不建议在 gradle 中升级新版本
- php - 为什么在 yii2 的控制器中发生标头发送错误?
- jupyter-notebook - Jupyter笔记本中的Markdown表不起作用