SQL - 关于 PIVOT 行为的解释

Posted

技术标签:

【中文标题】SQL - 关于 PIVOT 行为的解释【英文标题】:SQL - explanation on PIVOT behavior 【发布时间】:2021-01-24 11:49:30 【问题描述】:

对于表格课程中的成本列值,请尝试将成本值转换为一个成本值发生次数的表格,例如 1095 美元发生 3 次。

      1095       1195       1595       NULL
---------- ---------- ---------- ----------
         3         25          1          1

成本价值

select cost from course
order by cost;

COST
----------
1095
1095
1095
1195
...
1195
1595
NULL

这行得通。

WITH counter AS (
    SELECT 
        cost
    FROM course    
)
select * from counter
pivot (
    count(*)
    for (cost)
    in (1095, 1195, 1595, NULL)
);

      1095       1195       1595       NULL
---------- ---------- ---------- ----------
         3         25          1          1

这不是。

select cost from course
pivot (
    count(*)
    for (cost)
    in (1095, 1195, 1595, NULL)
);

ORA-00904: "COST": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 178 Column: 8

问题

在我看来,既选择了cost,又选择了count(*),但前者有效,后者无效。请帮助理解原因。

【问题讨论】:

因为在旋转后,您的所有成本都被分配到具有成本金额的列中,并且不再有 cost 列。您可以使用select * 观察它,它会显示您拥有的所有列。 【参考方案1】:

select cost from course 不起作用

SQL> select cost from course
  2  pivot (
  3      count(*)
  4      for (cost)
  5      in (1095, 1195, 1595, NULL)
  6  );
select cost from course
       *
ERROR at line 1:
ORA-00904: "COST": invalid identifier

看到星号了吗?指出错误原因。

select * from course 工作:

SQL> select * from course
  2  pivot (
  3      count(*)
  4      for (cost)
  5      in (1095, 1195, 1595, NULL)
  6  );

      1095       1195       1595       NULL
---------- ---------- ---------- ----------
         2          1          1          0

原因?语法是这样的:

SELECT * FROM                  --> here; there's no "COLUMN1" or "<column list>" but "*"
(
  SELECT column1, column2
  FROM tables
  WHERE conditions
)
PIVOT 
(
  aggregate_function(column2)
  FOR column2
  IN ( expr1, expr2, ... expr_n) | subquery
)
ORDER BY expression [ ASC | DESC ];

【讨论】:

以上是关于SQL - 关于 PIVOT 行为的解释的主要内容,如果未能解决你的问题,请参考以下文章

算法解释

如何解释此 SQL Server CE 行为 - 不更新

行为型模式--解释器模式

CoreData 和并发:无法解释的行为

设计模式-行为型模式,解释器模式(12)

C++ 字符连接与 std::string 行为。请解释一下