mysql - 如何合并两个具有不同 WHERE 和特殊条件的选择

标签 mysql sql inner-join

我有这样的表:

date|status|value

日期是日期, 状态为 1 为待处理,2 为已确认 值(value)是订单的值(value)

我想得到 3 列:

date|#status pending|#status pending+confirmed

数据示例:

+------------+-----------------+-----------------+
| date       | status          | value           |
+------------+-----------------+-----------------+
| 2015-11-17 |              1  |               89|
| 2015-11-16 |              1  |               6 |
| 2015-11-16 |              2  |              16 |
| 2015-11-16 |              2  |              26 |
| 2015-11-15 |              2  |              26 |
| 2015-11-14 |              2  |              24 |
+------------+-----------------+-----------------+

我想要的例子:

+------------+-----------------+-----------------+
| date       | confirmed       |confirmed+pending|
+------------+-----------------+-----------------+
| 2015-11-17 |              0  |               1 |
| 2015-11-16 |              2  |               3 |
| 2015-11-15 |              1  |              1 |
| 2015-11-14 |              1  |              1 |
+------------+-----------------+-----------------+

我正在尝试:

    SELECT array1.DATE
        ,array1.confirmed
        ,array2.total
    FROM (
        SELECT DATE (DATE) AS DATE
            ,count(value) AS confirmed
        FROM Orders
        WHERE STATUS = '2'
        GROUP BY DATE (DATE) DESC limit 5
        ) AS array1
    INNER JOIN (
        SELECT DATE (DATE) AS DATE
            ,count(value) AS total
        FROM Orders
        GROUP BY DATE (DATE) DESC limit 5
        ) AS array2

但我每个日期得到 4 个结果,重复确认值(value)和不同的总交易。

如果我尝试分开,我可以获得两个正确的信息:

将仅列出最近 5 天已确认订单的总和:

SELECT array1.DATE
    ,array1.confirmed
    ,array2.total
FROM (
    SELECT DATE (DATE) AS DATE
        ,count(valor) AS confirmed
    FROM Orders
    WHERE STATUS = '2'
    GROUP BY DATE (DATE) DESC limit 5;
    )

将列出最近 5 天所有订单的总和:

SELECT DATE (DATE) AS DATE
    ,count(valor) AS total
FROM Orders
GROUP BY DATE (DATE) DESC limit 5

我观察到至少一个大问题:

有时我们会有一天有很多未确认订单和零确认订单,因此内部连接可能会失败。

最佳答案

您可以使用CASE WHEN,为了获得您已给出的预期输出。

SELECT `date`,
    (SUM(CASE WHEN `status`=1 THEN 1 ELSE 0 END)) AS Confirmed,
    (SUM(CASE WHEN `status`=1 OR `status`=2 THEN 1 ELSE 0 END)) AS Confirmed_Pending
    FROM
    table_name
    GROUP BY DATE(`date`) DESC 

希望这对您有所帮助。

关于mysql - 如何合并两个具有不同 WHERE 和特殊条件的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33764297/

相关文章:

sql - 如何从 Oracle CSV 导出中删除注释行?

sql - 根据一天的最后一小时选择记录

mysql - 在不存在时插入,但在条件存在时更新

mysql - 使用 SQL INNER JOIN 批量更新字段

mysql - 如何在 MySQL 中使用更新语句,同时使用两个内联接并将表设置为串联?

MYSQL使用join查询多表

php - Mysql结果显示在php循环中

php mysql 如果 varchar 不为空

mysql - scala/slick 中的哪种数据类型与 mysql 中的地理点匹配?

php - 使用Ajax,使用mysql数据库从服务器下载文件