Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как собрать результирующую выборку? / 4 сообщений из 4, страница 1 из 1
05.02.2019, 19:31
    #39769831
seometis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как собрать результирующую выборку?
Есть таблица c лидами:
id ad_id year month day status payout1 123 2019 21 approved 5002 123 2019 21 declined 03 123 2019 21 wait 04 123 2019 21 approved 5005 123 2019 21 declined 06 222 2019 21 approved 5007 222 2019 21 declined 08 222 2019 21 declined 09 222 2019 21 approved 500

Из которой нужно сделать сводную:
ad_id year month day approved declined wait payout123 2019 21 2 2 1 1000222 2019 21 2 2 01000

Можно ли такое сделать за 1 запрос?
...
Рейтинг: 0 / 0
06.02.2019, 01:27
    #39769897
MikkiMouse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как собрать результирующую выборку?
seometis,

Не знаю, хто такие лиды, но запрос тут простой.
Следи за руками:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
mysql> CREATE TABLE chepuxa (
    ->     id INT AUTO_INCREMENT,
    ->     ad_id INT,
    ->     year INT,
    ->     month INT,
    ->     day INT,
    ->     status VARCHAR(10),
    ->     payout INT,
    ->     PRIMARY KEY (id)
    -> ) ENGINE=INNODB;
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO chepuxa (ad_id, year, month, day, status, payout)
    -> VALUES 
    ->     (123, 2019, 2, 1, 'approved', 500),
    ->     (123, 2019, 2, 1, 'declined', 0),
    ->     (123, 2019, 2, 1, 'wait', 0),
    ->     (123, 2019, 2, 1, 'approved', 500),
    ->     (123, 2019, 2, 1, 'declined', 0),
    ->     (222, 2019, 2, 1, 'approved', 500),
    ->     (222, 2019, 2, 1, 'declined', 0),
    ->     (222, 2019, 2, 1, 'declined', 0),
    ->     (222, 2019, 2, 1, 'approved', 500);
Query OK, 9 rows affected (0.11 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> SELECT 
    ->     ad_id,
    ->     year,
    ->     month,
    ->     day,
    ->     SUM(IF(status='approved', 1, 0)) AS approved,
    ->     SUM(IF(status='declined', 1, 0)) AS declined,
    ->     SUM(IF(status='wait', 1, 0))     AS wait,
    ->     SUM(payout)                      AS payout
    -> FROM chepuxa
    -> GROUP BY ad_id, year, month, day;
+-------+------+-------+------+----------+----------+------+--------+
| ad_id | year | month | day  | approved | declined | wait | payout |
+-------+------+-------+------+----------+----------+------+--------+
|   123 | 2019 |     2 |    1 |        2 |        2 |    1 |   1000 |
|   222 | 2019 |     2 |    1 |        2 |        2 |    0 |   1000 |
+-------+------+-------+------+----------+----------+------+--------+
2 rows in set (0.01 sec)
...
Рейтинг: 0 / 0
06.02.2019, 01:29
    #39769898
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как собрать результирующую выборку?
MikkiMouse
Код: sql
1.
SUM(IF(status='approved', 1, 0))

Можно сократить:
Код: sql
1.
SUM(status='approved')
...
Рейтинг: 0 / 0
06.02.2019, 07:47
    #39769913
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как собрать результирующую выборку?
seometisМожно ли такое сделать за 1 запрос?Обычный PIVOT. Если список всех возможных статусов фиксирован и не изменится в будущем - показанный выше запрос, пожалуй, оптимален. Иначе нужно использовать ХП с динамическим SQL. См. напр. PIVOT средствами MySQL .
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как собрать результирующую выборку? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]