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 行为的解释的主要内容,如果未能解决你的问题,请参考以下文章