【问题标题】:MySQL select rows based on a result between two date columnsMySQL 根据两个日期列之间的结果选择行
【发布时间】:2014-12-23 00:18:45
【问题描述】:

我有一张这样的桌子:

id | Type |   Date     |  DocDate
------------------------------
1  |  A   | 2014-04-05 | 2014-04-05
2  |  A   | 2014-05-06 | 2014-05-08
3  |  B   | 2014-06-06 | 2014-06-06

我需要创建一个堆积条形字符。但要做到这一点,我需要将我的表格转换为:

Type |  Green  |  Red
-----------------------
 A   |   1     |   1
 B   |   1     |   0

其中绿色和红色代表以下条件的结果:

IF (DocDate - Date) <= 1 THEN Green
IF (DocDate - Date) > 1  THEN Red

我试过这个查询:

SELECT CASE 
    WHEN (DocDate - Date) <= 1 THEN 'Green'
    WHEN (DocDate - Date) > 1 THEN 'Red'
END AS X, Count(OccurrenceID) AS Total
FROM tbloccurrence
GROUP BY CASE
    WHEN (DocDate - Date) <= 1 THEN 'Green'
    WHEN (DocDate - Date) > 1 THEN 'Red'
END;

但结果不是我需要的。有人可以帮帮我吗?

【问题讨论】:

    标签: mysql select datediff stacked


    【解决方案1】:

    我首先编写了一个查询,从您的表中提取每一行,并分配绿色或红色列。为此,您可以使用IF() 语句。这需要 3 个参数:一个条件,如果该条件为真怎么办,如果该条件为假怎么办。这给了我们这个:

    SELECT type, IF(DATEDIFF(docdate, dateCol) <= 1, 1, 0) AS green, IF(DATEDIFF(docdate, dateCol) > 1, 1, 0) AS red
    FROM myTable;
    

    我还使用了DATEDIFF() 函数。这将返回两个参数之间的整数天数(它采用 DATE 或 DATETIME 参数)。

    然后,我只是将红色和绿色列相加并按类型分组以匹配您的结果集:

    SELECT type, SUM(IF(DATEDIFF(docdate, dateCol) <= 1, 1, 0)) AS green, SUM(IF(DATEDIFF(docdate, dateCol) > 1, 1, 0)) AS red
    FROM myTable
    GROUP BY type;
    

    这是您的免费SQL Fiddle

    【讨论】:

    • 这正是我需要的!非常感谢!
    猜你喜欢
    • 2012-04-29
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多