Можно ли использовать Crosstab / Pivot Query в MySQL? - PullRequest
7 голосов
/ 19 января 2012

Я использую MySQL.Это таблица, у меня есть

supplier_ID   Item_ID   Date                  Price    QTY
1             1         2012-01-01 00:00:00   500.00   2
1             1         2012-01-03 00:00:00   450.00   10
2             1         2012-01-01 00:00:00   400.00   5
3             1         2012-05-01 00:00:00   500.00   1

Мне нужен запрос на выборку, показывающий таблицу как-то так.

supplier_ID      2012-01-01   2012-01-03   2012-05-01   
1                500.00(2)    450.00(10)   null
2                400.00(5)    null         null
3                null         null         500.00(1)

Ответы [ 2 ]

6 голосов
/ 19 января 2012

Вы можете использовать этот запрос -

SELECT
  supplier_id,
  MAX(IF(date = '2012-01-01', value, NULL)) AS '2012-01-01',
  MAX(IF(date = '2012-01-03', value, NULL)) AS '2012-01-03',
  MAX(IF(date = '2012-05-01', value, NULL)) AS '2012-05-01'
FROM (
  SELECT supplier_id, DATE(date) date, CONCAT(SUM(price), '(', qty, ')') value FROM supplier
    GROUP BY supplier_id, DATE(date)
    ) t
  GROUP BY supplier_id;

+-------------+------------+------------+------------+
| supplier_id | 2012-01-01 | 2012-01-03 | 2012-05-01 |
+-------------+------------+------------+------------+
|           1 | 500.00(2)  | 450.00(10) | NULL       |
|           2 | 400.00(5)  | NULL       | NULL       |
|           3 | NULL       | NULL       | 500.00(1)  |
+-------------+------------+------------+------------+

Это дает желаемый результат. Но если вы хотите сделать это динамически, посмотрите на эту статью «Автоматизировать запросы сводных таблиц» - http://www.artfulsoftware.com/infotree/queries.php#523, или эту ссылку - Динамические сводные таблицы .

0 голосов
/ 24 июня 2015
SELECT supplier_ID, 
    CONCAT(SUM(IF(`date`='2012-01-01',ROUND(Price,2),NULL)), '(', SUM(IF(`date`='2012-01-01',QTY,NULL)), ')') AS '2012-01-01',
    CONCAT(SUM(IF(`date`='2012-01-03',ROUND(Price,2),NULL)), '(', SUM(IF(`date`='2012-01-03',QTY,NULL)), ')') AS '2012-01-03',
    CONCAT(SUM(IF(`date`='2012-05-01',ROUND(Price,2),NULL)), '(', SUM(IF(`date`='2012-05-01',QTY,NULL)), ')') AS '2012-05-01'
FROM supplier 
GROUP BY supplier_ID
...