Вычислите две разные суммы из одного столбца на основе разных условий в MYSQL - PullRequest
0 голосов
/ 03 мая 2020

У меня есть таблица с именем daily_purchases с

item    purchases    purchase_date
paper     1            2020-01-15
paper     3            2020-02-10
pencil    2            2020-01-17
pencil    3            2020-02-05

Я хочу получить суммы за 7 дней и 30 дней примерно так:

item    sevenday    thirtyday
paper   1           4
pencil  2           5

Я могу получить их отдельно, но не могу получить выше. Я пробовал то, что ниже, но вместо разделения итогов на item, как и ожидалось, я получаю одинаковую сумму для всех элементов, например так:

item    sevenday    thirtyday
paper   2           5
pencil  2           5

Вот что я пробовал:

SELECT item,
    (SELECT sum(purchases) FROM `daily_purchases` WHERE datediff(CURDATE(), purchase_date) < 8) as 'sevenday',
    (SELECT sum(purchases) FROM `daily_purchases` WHERE datediff(CURDATE(), purchase_date) < 31) as 'thirtyday'
FROM daily_purchases  
GROUP BY item
ORDER BY 'thirtyday' DESC

Ответы [ 2 ]

1 голос
/ 03 мая 2020

С условной агрегацией:

SELECT item,
  SUM(CASE WHEN DATEDIFF(CURDATE(), purchase_date) < 8 THEN purchases ELSE 0 END) 'sevenday',
  SUM(CASE WHEN DATEDIFF(CURDATE(), purchase_date) < 31 THEN purchases ELSE 0 END) 'thirtyday'
FROM daily_purchases  
GROUP BY item
0 голосов
/ 03 мая 2020

В тридцать и в воскресенье у вас нет фильтров для "элемента".

Но почему бы не использовать JOIN? Пример:

SELECT item, sevenday.sum as 7d, thirtyday.sum as 30d
FROM daily_purchases 
LEFT JOIN 
    ((SELECT sum(purchases) as sum FROM daily_purchases
      WHERE datediff(CURDATE(), purchase_date) < 8) as 'sevenday')
   ON daily_purchases.item = sevenday.item
LEFT JOIN 
    ((SELECT sum(purchases) as sum FROM `daily_purchases` 
      WHERE datediff(CURDATE(), purchase_date) < 31) as 'thirtyday') 
   ON daily_purchases.item = thirtyday.item

GROUP BY item
ORDER BY 'thirtyday' DESC

Я также предлагаю написать <= 7 вместо <8, это лучше для удобства чтения. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...