【问题标题】:SQL - explanation on PIVOT behaviorSQL - 关于 PIVOT 行为的解释
【发布时间】: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 * 观察它,它会显示您拥有的所有列。

标签: sql oracle pivot


【解决方案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 ];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2011-07-23
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多