如何解决SQL中按月动态分组
我使用 CASE 语句将数据分组到 Month 列中,如下所示:
SUM(CASE WHEN MONTH(date) = 1 THEN ROUND(value) END) as jan,SUM(CASE WHEN MONTH(date) = 2 THEN ROUND(value) END) as feb,SUM(CASE WHEN MONTH(date) = 3 THEN ROUND(value) END) as mar
是否可以不必定义不同的 CASE 分组?
我想在 WHERE 语句中定义数据范围,然后对我定义的任何范围按月分组报告。例如,我的报告可能从 20 年 7 月开始,而不是从 1 月开始。
这在 SQL 查询中可行吗?
谢谢
编辑 - 示例输出:
+-------+-------+------+-------+-------+
| | July | Aug | Sep | etc |
+-------+-------+------+-------+-------+
| value | 435 € | 24 € | 234 € | 453 € |
+-------+-------+------+-------+-------+
编辑 - 可能的解决方案/解决方法:
如果我执行以下操作,则可以将其视为“半动态”。我仍然需要定义月份“桶”,但它们可以由开始日期触发(月份({ d '2021-01-01'})部分也可以稍后用变量替换,因此也是固定的在代码中。
SUM (CASE WHEN MONTH(date) = month({ d '2021-01-01' }) THEN value END) as month_1,SUM (CASE WHEN MONTH(date) = month({ d '2021-01-01' })+1 THEN value END) as month_2,SUM (CASE WHEN MONTH(date) = month({ d '2021-01-01' })+2 THEN value END) as month_3,etc
主要的缺点是我必须对月份分组的数量进行硬编码。所以我很高兴听到更好的解决方案!
解决方法
可以创建动态sql语句,将结果生成到临时表中,然后从临时表中返回结果。下面是一个例子:
@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain) throws IOException,ServletException {
Authentication authentication;
try {
authentication = this.cognitoIdTokenProcessor.authenticate ((HttpServletRequest)request);
if (authentication != null) {
SecurityContextHolder.getContext().setAuthentication(authentication);
}
} catch (Exception var6) {
logger.error("Cognito ID Token processing error",var6);
SecurityContextHolder.clearContext();
}
filterChain.doFilter(request,response);
}
生成所需分组的逻辑取决于您。您将需要使用 the while loop to construct the statement text.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。