MySQL根据两个日期列之间的结果选择行

标签 mysql select datediff stacked

我有一个这样的表:

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;

但是结果不是我想要的。谁能帮帮我?

最佳答案

我首先编写了一个查询,从您的表中提取每一行,并分配绿色或红色列。为此,您可以使用 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 .

关于MySQL根据两个日期列之间的结果选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26594023/

相关文章:

java - 如何将java web应用程序添加到主服务器

sql - 从 SQL 结果中删除周末

另一个 PHP 脚本正在运行时,PHP 页面卡在加载中

php - 可以有效衡量趋势和受欢迎程度的数据库结构?

mysql - 选择具有三个最大值的组

MySQL SELECT 中的条件 SELECT

mysql不认识表?

mysql - 如果值不为空,则为 DATEDIFF

mysql - Datediff 秒返回错误

php - cakephp 使用组件作为 Controller 方法