首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择UNION: MySQL选择月份,前一个月- 1,月份-3

选择UNION: MySQL选择月份,前一个月- 1,月份-3
EN

Stack Overflow用户
提问于 2018-08-03 16:50:27
回答 2查看 143关注 0票数 0

按@gordon的评论编辑--

假设以下情况

代码语言:javascript
复制
CREATE TABLE card (date_field, numcard, month);

INSERT INTO card (date_filed, numcard, month) 
VALUES
    (2018-06-01, 12531, June-2018),
    (2018-06-02, 29182, June-2018),
    (2018-05-01, 12781, May-2018),
    (2018-05-29, 56171, May-2018),
    (2018-05-10, 27191, May-2108),
    (2018-04-10, 83231, April-2018),
    (2018-03-01, 31131, March-2018),
    (2018-03-02, 47131, March-2018),
    (2018-02-15, 34617, February-2018);

在这种情况下,我尝试使用一个查询获得6-2018 (M)、5-2018 (M-1)和3-2018 (M-3)的卡号.输出应该是像这样的1X3矩阵.期望输出

我试图使用下面的查询来解决这个问题:

为了解决我的问题,我遇到了一个讨论计算前一个月的MySQL查询和这个:MySQL:选择上个月和前一个月

代码语言:javascript
复制
    SELECT count(*) as 'M', '' as'M-1', '' as 'M-3' FROM my_table WHERE YEAR(date_field) = YEAR(CURRENT_DATE - INTERVAL 2 MONTH) AND MONTH(date_field) = MONTH(CURRENT_DATE - INTERVAL 2 MONTH)
UNION
    SELECT '' as 'M', count(*) as'M-1', '' as 'M-3'  FROM my_table WHERE YEAR(date_field) = YEAR(CURRENT_DATE - INTERVAL 3 MONTH) AND MONTH(date_field) = MONTH(CURRENT_DATE - INTERVAL 3 MONTH)
UNION
    SELECT '' as 'M', '' as 'M-1', count(*) as 'M-3'  FROM my_table WHERE YEAR(date_field) = YEAR(CURRENT_DATE - INTERVAL 4 MONTH) AND MONTH(date_field) = MONTH(CURRENT_DATE - INTERVAL 4 MONTH)

..。它给了一个

具有价值(位数:-( .)只有对角线。

我想要的是这个

*谢谢您的帮助和见解。周末快乐!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-03 17:28:43

您可以使用条件聚合。只计算满足条件的行。如果满足条件,则使用返回任何非空值的CASE来执行此操作。否则,CASE将在默认情况下返回null,如果count(ex)的计算结果为NULL,则由于ex不计算一行,因此该行不被计数。

您还可能希望以一种方式重新处理您的条件,即date_field是比较运算符一侧的完整表达式,因此可以使用date_field上的索引。(对于WHENs中的表达式并不那么重要,对于WHERE子句中的表达式来说则是如此。)

代码语言:javascript
复制
SELECT count(CASE
               WHEN date_field >= current_date - interval 2 month - interval dayofmonth(current_date) - 1 day
                    AND date_field < current_date - interval 1 month - interval dayofmonth(current_date) - 1 day THEN
                 1
             END) `M`,
       count(CASE
               WHEN date_field >= current_date - interval 3 month - interval dayofmonth(current_date) - 1 day
                    AND date_field < current_date - interval 2 month - interval dayofmonth(current_date) - 1 day THEN
                 1
             END) `M-1`,
       count(CASE
               WHEN date_field >= current_date - interval 4 month - interval dayofmonth(current_date) - 1 day
                    AND date_field < current_date - interval 3 month - interval dayofmonth(current_date) - 1 day THEN
                 1
             END) `M-3`,
       FROM my_table
       WHERE date_field >= current_date - interval 4 month - interval dayofmonth(current_date) - 1 day
             AND date_field < current_date - interval 1 month - interval dayofmonth(current_date) - 1 day;
票数 2
EN

Stack Overflow用户

发布于 2018-08-03 17:03:44

几乎可以肯定有一个更好的方法来做你想做的事情,但是考虑到你拥有的东西,你可以做这样的事情:

代码语言:javascript
复制
select max(a), max(b), max(c) from(
  select '1' as a, ''as b, '' as c
  union
  select '' as a, '2' as b, '' as c
  union 
  select '' as a, '' as b, '3' as c
) d;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51677026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档