Oracle兼容-语法-PIVOT


PIVOT 语法可以将查询以交叉表的形式显示,与一般查询相比,交叉表具有更多的列和较少的行。

1. 语法

  1. SELECT ...
  2. select_expr [, select_expr] ...
  3. ...
  4. [FROM table_references
  5. [PARTITION partition_list] [pivot_clause]]
  6. [WHERE where_condition]
  7. ...
  8. pivot_clause:
  9. PIVOT
  10. ( aggregate_function ( expr ) [[AS] alias ]
  11. [, aggregate_function ( expr ) [[AS] alias ] ]...
  12. pivot_for_clause
  13. pivot_in_clause
  14. )
  15. pivot_for_clause:
  16. FOR { column
  17. | ( column [, column]... )
  18. }
  19. pivot_in_clause:
  20. IN ({
  21. { expr | ( expr [, expr]... ) } [ [ AS] alias]
  22. }...
  23. )

2. 定义和用法

  1. pivot_clause 定义了查询将在哪些字段上聚合数据。
  2. pivot_for_clause 定义了哪些列将被分组,然后交叉聚合。
  3. pivot_in_clause 用于过滤 pivot_for_clause 中列的值,子句中的每个值都将是一个单独的列,子句中使用的表达式只能是常量表达式。
  4. pivot_for_clausepivot_in_clause 没有使用到的列都将作为隐式分组的字段。
  5. select_expr 只能使用隐式分组用到的字段以及 pivot_in_clause 中交叉聚合后生成的列。
  6. 可以有多个 aggregate_function,但只允许有一个 aggregate_function 不指定别名,且 aggregate_function 不支持 GROUP_CONCAT()WM_CONCAT() 函数。

3. Oracle兼容说明

  • 不支持 XML with ANYXML with Subquery 语法
  1. greatsql> CREATE TABLE t1(a INT, b INT, c INT);
  2. greatsql> CREATE TABLE t2(a INT, b INT, c INT);
  3. greatsql> SELECT * FROM t1 PIVOT XML (SUM(c) FOR a IN(ANY));
  4. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'XML (SUM(c) FOR a IN(ANY))' at line 1
  5. greatsql> SELECT * FROM t1 PIVOT XML (SUM(c) FOR a IN(SELECT a FROM t2));
  6. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'XML (SUM(c) FOR a IN(SELECT a FROM t2))' at line 1
  • 不支持 table_references 中的表结果有同名的列
  1. -- 执行本示例需要先切换sql_mode = ORACLE,否则会报告语法错误,其他示例不受影响
  2. greatsql> SET sql_mode = ORACLE;
  3. greatsql> CREATE TABLE t1(a INT, b INT, c INT);
  4. greatsql> CREATE TABLE t2(a INT, b INT, c INT);
  5. greatsql> SELECT * FROM t1 JOIN t2 USING(a, c) PIVOT(SUM(c) FOR (a) IN(1, 2, 3, 4, 5 ,6));
  6. ERROR 1060 (42S21): Duplicate column name 'b'

4. 示例

  1. -- 初始化测试数据
  2. greatsql> CREATE TABLE t1(a INT, b INT, c INT);
  3. greatsql> INSERT INTO t1 VALUES (1, 1, 1) (2, 1, 2), (3, 2, 1), (4, 2, 2), (5, 3, 1), (6, 3, 2);
  4. greatsql> SELECT * FROM t1 PIVOT(SUM(c) FOR(a) IN(1, 2, 3, 4, 5, 6)) ORDER BY b;
  5. +------+------+------+------+------+------+------+
  6. | b | 1 | 2 | 3 | 4 | 5 | 6 |
  7. +------+------+------+------+------+------+------+
  8. | 1 | 1 | 2 | NULL | NULL | NULL | NULL |
  9. | 2 | NULL | NULL | 1 | 2 | NULL | NULL |
  10. | 3 | NULL | NULL | NULL | NULL | 1 | 2 |
  11. +------+------+------+------+------+------+------+
  12. 3 rows in set (0.00 sec)
  13. greatsql> SELECT * FROM t1 PIVOT(SUM(c) FOR(a) IN(1 AS I, 2 AS II, 3 AS III, 4 AS IV, 5 AS V, 6 AS VI)) ORDER BY b;
  14. +------+------+------+------+------+------+------+
  15. | b | I | II | III | IV | V | VI |
  16. +------+------+------+------+------+------+------+
  17. | 1 | 1 | 2 | NULL | NULL | NULL | NULL |
  18. | 2 | NULL | NULL | 1 | 2 | NULL | NULL |
  19. | 3 | NULL | NULL | NULL | NULL | 1 | 2 |
  20. +------+------+------+------+------+------+------+
  21. 3 rows in set (0.00 sec)
  22. greatsql> SELECT * FROM t1 PIVOT(SUM(c) AS TOTAL FOR(a) IN(1 AS I, 2 AS II, 3 AS III, 4 AS IV, 5 AS V, 6 AS VI)) ORDER BY b;
  23. +------+---------+----------+-----------+----------+---------+----------+
  24. | b | I_TOTAL | II_TOTAL | III_TOTAL | IV_TOTAL | V_TOTAL | VI_TOTAL |
  25. +------+---------+----------+-----------+----------+---------+----------+
  26. | 1 | 1 | 2 | NULL | NULL | NULL | NULL |
  27. | 2 | NULL | NULL | 1 | 2 | NULL | NULL |
  28. | 3 | NULL | NULL | NULL | NULL | 1 | 2 |
  29. +------+---------+----------+-----------+----------+---------+----------+
  30. 3 rows in set (0.00 sec)
  31. greatsql> SELECT * FROM t1 PIVOT(SUM(c) AS TOTAL, count(c) FOR(a) IN(1 AS I, 2 AS II, 3 AS III, 4 AS IV, 5 AS V, 6 AS VI)) ORDER BY b;
  32. +------+---------+---+----------+----+-----------+-----+----------+----+---------+---+----------+----+
  33. | b | I_TOTAL | I | II_TOTAL | II | III_TOTAL | III | IV_TOTAL | IV | V_TOTAL | V | VI_TOTAL | VI |
  34. +------+---------+---+----------+----+-----------+-----+----------+----+---------+---+----------+----+
  35. | 1 | 1 | 1 | 2 | 1 | NULL | 0 | NULL | 0 | NULL | 0 | NULL | 0 |
  36. | 2 | NULL | 0 | NULL | 0 | 1 | 1 | 2 | 1 | NULL | 0 | NULL | 0 |
  37. | 3 | NULL | 0 | NULL | 0 | NULL | 0 | NULL | 0 | 1 | 1 | 2 | 1 |
  38. +------+---------+---+----------+----+-----------+-----+----------+----+---------+---+----------+----+
  39. 3 rows in set (0.00 sec)
  40. greatsql> SELECT * FROM t1 PIVOT(SUM(c) AS TOTAL, count(c) AS NUM FOR(a) IN(1 AS I, 2 AS II, 3 AS III, 4 AS IV, 5 AS V, 6 AS VI)) ORDER BY b;
  41. +------+---------+-------+----------+--------+-----------+---------+----------+--------+---------+-------+----------+--------+
  42. | b | I_TOTAL | I_NUM | II_TOTAL | II_NUM | III_TOTAL | III_NUM | IV_TOTAL | IV_NUM | V_TOTAL | V_NUM | VI_TOTAL | VI_NUM |
  43. +------+---------+-------+----------+--------+-----------+---------+----------+--------+---------+-------+----------+--------+
  44. | 1 | 1 | 1 | 2 | 1 | NULL | 0 | NULL | 0 | NULL | 0 | NULL | 0 |
  45. | 2 | NULL | 0 | NULL | 0 | 1 | 1 | 2 | 1 | NULL | 0 | NULL | 0 |
  46. | 3 | NULL | 0 | NULL | 0 | NULL | 0 | NULL | 0 | 1 | 1 | 2 | 1 |
  47. +------+---------+-------+----------+--------+-----------+---------+----------+--------+---------+-------+----------+--------+
  48. 3 rows in set (0.00 sec)
  49. greatsql> CREATE TABLE t2(a INT, b INT, c INT, d INT);
  50. greatsql> INSERT INTO t2 VALUES (1, 1, 1, 1); (2, 1, 2, 2); (3, 2, 1, 1); (4, 2, 2, 2); (5, 3, 1, 1); (6, 3, 2, 2);
  51. greatsql> SELECT * FROM t2 PIVOT(SUM(c) FOR(a, d) IN((1,1), (2,2), (3,1), (4,2), (5,1), (6,2))) ORDER BY b;
  52. +------+------+------+------+------+------+------+
  53. | b | 1_1 | 2_2 | 3_1 | 4_2 | 5_1 | 6_2 |
  54. +------+------+------+------+------+------+------+
  55. | 1 | 1 | 2 | NULL | NULL | NULL | NULL |
  56. | 2 | NULL | NULL | 1 | 2 | NULL | NULL |
  57. | 3 | NULL | NULL | NULL | NULL | 1 | 2 |
  58. +------+------+------+------+------+------+------+
  59. 3 rows in set (0.00 sec)

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx