Sql Oracle-有没有办法在单个Select语句中编写此查询?
我有以下疑问:Sql Oracle-有没有办法在单个Select语句中编写此查询?,sql,oracle,oracle11g,pivot,Sql,Oracle,Oracle11g,Pivot,我有以下疑问: SELECT * FROM ( SELECT * FROM View_ExecutiveForecastReport WHERE WORKGROUPID IN (94) ) PIVOT (SUM(COURSELENGTH) AS LENGTH FOR (WORKGROUPID) IN ( 94 as "B2B", 66 as "CFS", 69 as "800IB", 76 as "TSData", 99 as "RetailSales", 103 as "Te
SELECT * FROM (
SELECT * FROM View_ExecutiveForecastReport
WHERE WORKGROUPID IN (94)
)
PIVOT (SUM(COURSELENGTH) AS LENGTH FOR (WORKGROUPID) IN (
94 as "B2B",
66 as "CFS",
69 as "800IB",
76 as "TSData",
99 as "RetailSales",
103 as "Telesales"
))
我想用一个SELECT而不是嵌套来编写它。我试过:
SELECT * FROM View_ExecutiveForecastReport
WHERE WORKGROUPID IN (94)
PIVOT (SUM(COURSELENGTH) AS LENGTH FOR (WORKGROUPID) IN (
94 as "B2B",
66 as "CFS",
69 as "800IB",
76 as "TSData",
99 as "RetailSales",
103 as "Telesales"
))
但是我得到了错误:ORA-00933:SQL命令没有正确结束
我也试过:
SELECT * FROM View_ExecutiveForecastReport
PIVOT (SUM(COURSELENGTH) AS LENGTH FOR (WORKGROUPID) IN (
94 as "B2B",
66 as "CFS",
69 as "800IB",
76 as "TSData",
99 as "RetailSales",
103 as "Telesales"
))
WHERE WORKGROUPID IN (94)
这给了我一个错误:ORA-00904:“工作组ID”:无效标识符
如果删除WHERE子句,查询工作正常。我也对使用CTE的解决方案持开放态度。这不起作用,因为PIVOT是FROM子句表参考部分的一部分,这就是为什么它起作用的原因:
SELECT * FROM View_ExecutiveForecastReport
PIVOT (SUM(COURSELENGTH) AS LENGTH FOR (WORKGROUPID) IN (
94 as "B2B",
66 as "CFS",
69 as "800IB",
76 as "TSData",
99 as "RetailSales",
103 as "Telesales"
))
由于workgroupid在PIVOT转换中不作为列返回,因此不能在WHERE子句中使用它。SELECT*FROM(subquery)PIVOT的使用非常普遍,因此我建议您使用它。我决定也发布一个CTE版本的工作查询,尽管我不知道这是否比我原来的工作查询有任何优势
WITH V AS (SELECT * FROM View_ExecutiveForecastReport WHERE WORKGROUPID IN (94))
SELECT * FROM V
PIVOT (SUM(COURSELENGTH) AS LENGTH FOR (WORKGROUPID) IN (
94 as "B2B",
66 as "CFS",
69 as "800IB",
76 as "TSData",
99 as "RetailSales",
103 as "Telesales"
))
当我尝试这个时,我得到了
ORA-00904:“WORKGROUPID”:无效标识符
Oops,我错过了。请记住,PIVOT会更改由FROM表示的表,因此,除非您将其表示为PIVOT的一部分,否则它将不存在于返回的列中。只使用原始版本。好的,那么官方的答案是,如果不使用嵌套查询,就没有办法做到这一点?我不知道官方的情况,但看起来是这样的。我现在手头没有11g实例可以试用,否则我会更深入地研究它。仔细想想,这样可能更好。你在子选择中进行过滤,所以枢轴只需针对较小的数据集运行,而不是对所有数据进行枢轴,然后选择你需要的部分。它仍然进行子选择,所以我怀疑它是相同的。是的,这可能只是语法首选项。