Запрос к обеим группам по имени в одном столбце и отображение итогов для каждого сгруппированного элемента - PullRequest
0 голосов
/ 02 марта 2020

У меня есть таблица, которая выглядит примерно как этот пример c.

+-------+--------------+------------+---------------+-----------+----------+
|  id   |    name      |   amount   | payment_type  |   year    |  period  |
+-------+--------------+------------+---------------+-----------+----------+
|  1    |     Bob      |     20     |     BACS      |   2019    |     5    |
+-------+--------------+------------+---------------+-----------+----------+
|  2    |     Jim      |     40     |     BACS      |   2019    |     5    |
+-------+--------------+------------+---------------+-----------+----------+
|  3    |     Bob      |     60     |     BACS      |   2019    |     5    |
+-------+--------------+------------+---------------+-----------+----------+
|  4    |     Jim      |     20     |     Voucher   |   2019    |     5    |
+-------+--------------+------------+---------------+-----------+----------+
|  5    |     Bob      |     40     |     BACS      |   2019    |     5    |
+-------+--------------+------------+---------------+-----------+----------+
|  6    |     Bob      |     20     |     Cheque    |   2019    |     5    |
+-------+--------------+------------+---------------+-----------+----------+
|  7    |     Jim      |     20     |     BACS      |   2019    |     5    |
+-------+--------------+------------+---------------+-----------+----------+
|  8    |     Bob      |     20     |     BACS      |   2019    |     5    |
+-------+--------------+------------+---------------+-----------+----------+
|  9    |     Bob      |     20     |     BACS      |   2019    |     5    |
+-------+--------------+------------+---------------+-----------+----------+
|  10   |     Dan      |     20     |     BACS      |   2019    |     5    |
+-------+--------------+------------+---------------+-----------+----------+
|  11   |     Dan      |     20     |     Voucher   |   2019    |     5    |
+-------+--------------+------------+---------------+-----------+----------+
etc...

Я хотел бы подвести итоги этой таблицы (еще много строк) и подсчитать общее количество количество строк для каждого пользователя, общая сумма столбца суммы для каждого пользователя и общая сумма каждого типа платежа для каждого пользователя, суженная по году и периоду каждый раз, когда я запускаю этот запрос. (Год и период выбираются пользователем в форме.) В результате я получаю набор результатов, который выглядит примерно так:

+-------+--------------+------------+---------------+-----------+----------+
|  name |    Total     |   BACS     |    Cheque     |   Voucher |   Cost   |
+-------+--------------+------------+---------------+-----------+----------+
|  Bob  |      6       |     5      |       1       |     0     |    180   |
+-------+--------------+------------+---------------+-----------+----------+
|  Jim  |      3       |     2      |       0       |     1     |    80    |
+-------+--------------+------------+---------------+-----------+----------+
|  Dan  |      2       |     1      |       0       |     1     |    40    |
+-------+--------------+------------+---------------+-----------+----------+

Поэтому мне нужен какой-то поворотный запрос, используя случай с суммой примерно такой:

SELECT
    name,
    SUM(CASE WHEN YEAR = '$safefy' THEN 1 ELSE 0 END) AS total,
    SUM(CASE WHEN payment_type = 'BACs' OR payment_type = 'BACS' THEN 1 ELSE 0 END) AS BACS,
    SUM(CASE WHEN payment_type = 'Cheque' THEN 1 ELSE 0 END) AS Cheque,
    SUM(CASE WHEN payment_type = 'Voucher' THEN 1 ELSE 0 END) AS Voucher,
    <Not sure what goes here.> AS Cost,
FROM
    table_name
WHERE
    YEAR = '2019' AND period = '5'
GROUP BY
    name "

Но я не уверен, как подсчитать стоимость из столбца суммы таблиц для каждого пользователя. Вероятно, я не использую правильные термины в своем поиске ответов, потому что я не знаю, как это называется?

1 Ответ

0 голосов
/ 02 марта 2020

Я думаю, вы просто хотите sum(amount):

SELECT name,
       SUM(CASE WHEN YEAR = '$safefy' THEN 1 ELSE 0 END) AS total,
       SUM(CASE WHEN payment_type = 'BACs' OR payment_type = 'BACS' THEN 1 ELSE 0 END) AS BACS,
       SUM(CASE WHEN payment_type = 'Cheque' THEN 1 ELSE 0 END) AS Cheque,
       SUM(CASE WHEN payment_type = 'Voucher' THEN 1 ELSE 0 END) AS Voucher,
       SUM(amount) AS Cost
FROM table_name
WHERE YEAR = '2019' AND period = '5'
GROUP BY name;

Вы можете упростить первую часть, потому что CASE не требуется:

SELECT name,
       SUM(YEAR = '$safefy') AS total,
       SUM(payment_type IN ('BACs', 'BACS') THEN 1 ELSE 0 END) AS BACS,
       SUM(payment_type = 'Cheque') AS Cheque,
       SUM(payment_type = 'Voucher') AS Voucher,
       SUM(amount) AS Cost
FROM table_name
WHERE YEAR = '2019' AND period = '5'
GROUP BY name
...