如何按日期分组并根据值创建列?

时间:2017-05-07 13:25:30

标签: mysql sql group-by pivot

我有一个包含两列的订单表:shipping_id引用送货方式,packed保留订单打包的日期。

+-------------+------------+
| shipping_id |   packed   |
+-------------+------------+
| 1           | 2017-05-07 |
| 1           | 2017-05-06 |
| 2           | 2017-05-06 |
| 2           | 2017-05-06 |
| 3           | 2017-05-05 |
+-------------+------------+

我需要以某种方式将结果按日期packed分组,作为列的货运类型和单元格的值是当天打包的订单数量以及使用该送货方式。像这样:

+------------+---+---+---+
|    date    | 1 | 2 | 3 |
+------------+---+---+---+
| 2017-05-05 | 0 | 0 | 1 |
| 2017-05-06 | 1 | 2 | 0 |
| 2017-05-07 | 1 | 0 | 0 |
+------------+---+---+---+

这在MySQL中可行吗? SQL查询将如何?

谢谢

1 个答案:

答案 0 :(得分:1)

您无法使用vanilla SQL查询执行此操作,您必须使用存储过程。

对于动态数据透视,请查看MySQL pivot row into dynamic number of columns,但您会发现它并不是很容易使用:默认情况下,GROUP_CONCAT()限制为1024字节。 #39; ll需要制作和使用程序的权利。

Vanilla SQL最多只能为您提供查询1

SQL Fiddle

查询1

select `shipping_id`, `packed`, count(1) as nb
from t
group by `shipping_id`, `packed`
order by `packed`, `shipping_id`

<强> Results

| shipping_id |     packed | nb |
|-------------|------------|----|
|           3 | 2017-05-05 |  1 |
|           1 | 2017-05-06 |  1 |
|           2 | 2017-05-06 |  2 |
|           1 | 2017-05-07 |  1 |

查询2

SET @sql = NULL

查询3

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'COUNT(IF(shipping_id = ''',
      shipping_id,
      ''', 1, NULL)) AS `',
      shipping_id,'`'
    )
  ) INTO @sql
FROM t

查询4

SET @sql = CONCAT('SELECT packed, ', @sql, ' FROM t GROUP BY packed ORDER BY `packed`')

查询5

PREPARE stmt FROM @sql

查询6

EXECUTE stmt

<强> Results

|     packed | 1 | 2 | 3 |
|------------|---|---|---|
| 2017-05-05 | 0 | 0 | 1 |
| 2017-05-06 | 1 | 2 | 0 |
| 2017-05-07 | 1 | 0 | 0 |

查询7

DEALLOCATE PREPARE stmt