在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

只有两个区别:

  1. 另一个答案只在GROUP BY中放入一列。我同意这是有道理的,但是当我这样做时,我得到一个错误:列'sub.PERMTYPE'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
  2. 另一个答案在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)

除了mysql 和 sql server, 你还有另外一种选择 postgreSQL

将数据从 SQL Server 导出到 PostgreSQL