sql - 在 SQL Server 和 Postgresql 中将 CASE 用于类似枢轴的函数

标签 sql sql-server postgresql

我正在尝试创建一个简单的类似数据透视表的报告,我设法使用 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 中。我同意这是有道理的,但是当我这样做时,我得到一个错误:Column 'sub.PERMTYPE' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
  2. 另一个答案在 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/

相关文章:

php - 如何重写我的 PHP 和 MySQL 以按相等的列值对我的 HTML 列表进行分组?

sql-server - 告诉我 SQL Server 全文搜索器疯了,不是我疯了

sql - 用于安装 PostgreSQL 的 Bash 脚本 - 失败

sql - 如何获取分层表的根值(postgresql)

postgresql - plpgsql中的动态变量名(字符串到变量名)

mysql - 如果在连接中完成过滤或在连接后使用 where 子句,哪个查询更快

不能为空的 MySQL 数据类型?

sql-server - 在 View MS sql server 中按天分组(48 小时)

sql-server - Debezium:无法在 Kafka-Connect Docker 容器上设置观察者。获取关联 ID 为 2 的元数据时出错... LEADER_NOT_AVAILABLE

计算每个时间间隔增长的 SQL 语句