MySQL Error Code: 1064 При использовании SELECT CASE с агрегатными функциями - PullRequest
0 голосов
/ 01 марта 2019

У меня есть этот запрос:

SELECT 
    `t2`.`upc`,
    FORMAT(SUM(`t2`.`qty`), 0) AS <COLUMN NAME>
FROM
    (`orders` `t1`
    JOIN `sales` `t2` ON ((`t2`.`order_id` = `t1`.`id`)))
WHERE <CONDITION>
GROUP BY `t2`.`upc`

, который работает, как ожидается, со следующим CONDITIONS:

t1.`date_placed` > (CURDATE() - INTERVAL 42 DAY)
t1.order_status = 1

Я пытаюсь объединить эти отдельные запросы и получить их результаты длясоответствующий столбец = 0, если условие не было выполнено.

Это была моя попытка:

SELECT 
    `t2`.`upc`,
    CASE 
    WHEN (`t1`.`date_placed` > (CURDATE() - INTERVAL 42 DAY)) 
    THEN FORMAT(SUM(`t2`.`qty`), 0)
    ELSE 0
    END AS `qty_sold`,
    CASE
    WHEN t1.order_status = 1
    THEN FORMAT(SUM(`t2`.`qty`, 0))
    ELSE 0
    END AS `order_qty`
FROM
    `orders` `t1`
    JOIN `sales` `t2` ON (`t2`.`order_id` = `t1`.`id`)
WHERE `upc`=1001 OR `upc`=1002 OR `upc`=1003
GROUP BY `t2`.`upc`;

таблица заказов:

    +-----------+--------------+------------+
    |    id     | date_placed  |order_status|   
    +-----------+--------------+------------+
    |     1     |  2019-02-22  |      1     |
    +-----------+--------------+------------+
    |     2     |  2019-02-22  |      1     |
    +-----------+--------------+------------+
    |     3     |  2018-02-22  |      2     |
    +-----------+--------------+------------+

таблица продаж:

    +-----------+--------------+------+-----+
    |    id     |   order_id   | upc  | qty |
    +-----------+--------------+------+-----+
    |     1     |      1       | 1001 |  1  |
    +-----------+--------------+------+-----+
    |     2     |      1       | 1002 |  1  |
    +-----------+--------------+------+-----+
    |     3     |      1       | 1003 |  1  |
    +-----------+--------------+------+-----+
    |     4     |      2       | 1001 |  3  |
    +-----------+--------------+------+-----+
    |     5     |      3       | 1001 |  2  |
    +-----------+--------------+------+-----+
    |     6     |      3       | 1002 |  1  |
    +-----------+--------------+------+-----+

Ожидаемые результаты:

    +-----------+--------------+------------+
    |    upc    |   qty_sold   | order_qty  |   
    +-----------+--------------+------------+
    |   1001    |      4       |      4     |
    +-----------+--------------+------------+
    |   1002    |      1       |      1     |
    +-----------+--------------+------------+
    |   1003    |      1       |      1     |
    +-----------+--------------+------------+

Что я делаю не так?Если то, что я пытаюсь сделать с операторами CASE, невозможно, есть ли другой способ объединить эти запросы?

Буду признателен за любой совет:)

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

используйте сумму перед регистровым выражением и заменяйте или определяйте с помощью in

SELECT 
        `t2`.`upc`,
        sum(CASE 
        WHEN (`t1`.`date_placed` > (CURDATE() - INTERVAL 42 DAY)) 
        THEN FORMAT((`t2`.`qty`), 0)
        ELSE 0
        END ) AS `qty_sold`,
        sum(CASE
        WHEN t1.order_status = 2 
        THEN FORMAT((`t2`.`qty`, 0))
        ELSE 0
        END) AS `order_qty`
    FROM
        `orders` `t1`
        JOIN `sales` `t2` ON (`t2`.`order_id` = `t1`.`id`)
    WHERE t2.upc in (1001,1002,1003) 
    GROUP BY `t2`.`upc`;
0 голосов
/ 01 марта 2019

case должен быть аргументом функции агрегирования:

FORMAT(SUM(CASE WHEN (`t1`.`date_placed` > (CURDATE() - INTERVAL 42 DAY)) THEN `t2`.`qty`ELSE 0
           END), 0) AS `qty_sold`,
FORMAT(SUM(CASE WHEN t1.order_status = 2  THEN t2`.`qty` ELSE 0 
           END), 0) `order_qty`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...