在SQL Server和Postgresql中使用CASE作为类似于枢轴的函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在SQL Server和Postgresql中使用CASE作为类似于枢轴的函数相关的知识,希望对你有一定的参考价值。
我正在尝试创建一个简单的类似于透视的报告,我设法使用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
中放入一列。我同意这是有道理的,但是当我这样做时,我得到一个错误:列'sub.PERMTYPE'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 - 另一个答案在
sum()
内使用了CASE
。如果我这样做(以及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
另一答案
您希望通过Spacename和2个别名列对答案进行分组吗?
在SQL Server中,您可以尝试类似的东西:
SELECT SPACENAME,Read Access,Write Access
FROM
(
SELECT SPACENAME
, CASE WHEN PERMTYPE='VIEWSPACE' THEN 'X' END AS "Read Access"
, CASE WHEN PERMTYPE='EDITSPACE' THEN 'X' END AS "Write Access"
FROM ( ...) --i do not have a way to duplicate your situation
) as sub2
GROUP BY SPACENAME,Read Access,Write Access
以上是关于在SQL Server和Postgresql中使用CASE作为类似于枢轴的函数的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL 和SQL Server哪个更好些?(作为平时学习之用)
ORM 的哪些选择允许在“轻按开关”之间更改 RDBMS...SQL Server/SQL Azure 和 PostgreSQL/“云”PostgreSQL
是否有 PostgreSQL 等效的 SQL Server 探查器?
TransactionScope:具有不同数据库连接的嵌套事务(SQL Server 和 Postgresql)