我正在尝试创建一个简单的类似数据透视表的报告,我设法使用 SQL Server 的 pivot
来完成,但现在 SQL 需要在 SQL Server 和 Postgresql 上运行。
因此,我将 SQL 更改为使用 CASE
,如下所示:
SELECT SPACENAME
, CASE WHEN PERMTYPE='VIEWSPACE' THEN 'X' END AS "Read Access"
, CASE WHEN PERMTYPE='EDITSPACE' THEN 'X' END AS "Write Access"
FROM ( ...) sub
GROUP BY SPACENAME, PERMTYPE
ORDER BY SPACENAME
“...”是复杂子查询的去向,其输出是:
SPACENAME PERMTYPE
Testware Releases EDITSPACE
Testware Releases VIEWSPACE
Documentation VIEWSPACE
我正在尝试获取如下报告:
SPACENAME Read Access Write Access
Testware Releases X X
Documentation X
但我得到的是:
SPACENAME Read Access Write Access
Testware Releases X
Testware Releases X
Documentation X
我的CASE
建立在另一个例子的基础上:PostgreSQL crosstab() alternative with CASE and aggregates )
只有两个区别:
- 另一个答案只将一列放在
GROUP BY
中。我同意这是有道理的,但是当我这样做时,我得到一个错误:Column 'sub.PERMTYPE' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。 - 另一个答案在
CASE
中使用了sum()
。如果我这样做(连同GROUP BY
中的单列),我可以让它工作,但它显示一个基于数字的报告,但我真的只想要右列中的“X” ...
有什么方法可以在列中获取 X 而不是数字?
最佳答案
最大化 CASE,然后在 SPACENAME 上分组
SELECT SPACENAME
, MAX(CASE WHEN PERMTYPE='VIEWSPACE' THEN 'X' ELSE '' END) AS "Read Access"
, MAX(CASE WHEN PERMTYPE='EDITSPACE' THEN 'X' ELSE '' END) AS "Write Access"
FROM ( <<your big sub-query>> ) sub
GROUP BY SPACENAME
ORDER BY SPACENAME
关于sql - 在 SQL Server 和 Postgresql 中将 CASE 用于类似枢轴的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55071913/