如何按日期分组并根据值创建列?
How to group by date and make columns from values?
我有一个 table 用于包含两列的订单: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 查询会是什么样子?
谢谢
您将无法使用普通 SQL 查询来完成此操作,您必须使用存储过程。
对于动态数据透视,请查看 MySQL pivot row into dynamic number of columns ,但您会发现它并不是很容易使用:默认情况下 GROUP_CONCAT()
被限制为 1024 字节,您将需要制作和使用程序的权利。
原版 SQL 最多给你 查询 1。
查询 1:
select `shipping_id`, `packed`, count(1) as nb
from t
group by `shipping_id`, `packed`
order by `packed`, `shipping_id`
| 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
| 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
我有一个 table 用于包含两列的订单: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 查询会是什么样子?
谢谢
您将无法使用普通 SQL 查询来完成此操作,您必须使用存储过程。
对于动态数据透视,请查看 MySQL pivot row into dynamic number of columns ,但您会发现它并不是很容易使用:默认情况下 GROUP_CONCAT()
被限制为 1024 字节,您将需要制作和使用程序的权利。
原版 SQL 最多给你 查询 1。
查询 1:
select `shipping_id`, `packed`, count(1) as nb
from t
group by `shipping_id`, `packed`
order by `packed`, `shipping_id`
| 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
| 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