You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SQL Server与PostgreSQL中用CASE实现类Pivot报表的问题

解决跨SQL Server/PostgreSQL的透视报表重复行与显示"X"的问题

你离正确结果只差关键两步调整!问题核心出在GROUP BY字段选择和CASE结果的聚合处理上,我来帮你搞定:

修正后的兼容SQL语句

SELECT SPACENAME 
, MAX(CASE WHEN PERMTYPE='VIEWSPACE' THEN 'X' END) AS "Read Access" 
, MAX(CASE WHEN PERMTYPE='EDITSPACE' THEN 'X' END) AS "Write Access" 
FROM ( ...) sub 
GROUP BY SPACENAME
ORDER BY SPACENAME

关键调整详解

1. 移除GROUP BY中的PERMTYPE

你之前遇到的报错Column 'sub.PERMTYPE' is invalid...,是因为SQL语法要求:SELECT中的非聚合字段必须出现在GROUP BY子句中。现在我们需要按SPACENAME聚合所有权限记录,所以只保留SPACENAME在GROUP BY里,同时用聚合函数包裹CASE结果,这样就完全符合语法规则了。

2. 用MAX()实现"X"显示而非数字

为什么选MAX()而不是SUM?因为对于每个SPACENAME:

  • 当存在对应权限时,CASE返回'X',否则返回NULL;
  • MAX()函数会从该SPACENAME的所有CASE结果中取最大值(字符串比较中'X'优先级高于NULL),所以只要有一条匹配的权限记录,就会显示'X',没有则显示NULL,完美匹配你想要的报表样式。

这个写法同时兼容SQL Server和PostgreSQL,两者对MAX()处理字符串的逻辑完全一致。

结果验证

用你的示例子查询数据测试:

SPACENAMEPERMTYPE
Testware ReleasesEDITSPACE
Testware ReleasesVIEWSPACE
DocumentationVIEWSPACE

执行修正后的SQL会得到你期望的最终报表:

SPACENAMERead AccessWrite Access
Testware ReleasesXX
DocumentationXNULL

内容的提问来源于stack exchange,提问作者jimtut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:22:46