PostgreSQL 交叉表查询

2023-12-12

如何在 PostgreSQL 中创建交叉表查询?例如我有下表:

Section    Status    Count
A          Active    1
A          Inactive  2
B          Active    4
B          Inactive  5

我希望查询返回以下交叉表:

Section    Active    Inactive
A          1         2
B          4         5

安装附加模块tablefunc once每个数据库,提供以下功能crosstab()。从 Postgres 9.1 开始你可以使用CREATE EXTENSION为了那个原因:

CREATE EXTENSION IF NOT EXISTS tablefunc;

改进的测试用例

CREATE TABLE tbl (
   section   text
 , status    text
 , ct        integer  -- "count" is a reserved word in standard SQL
);

INSERT INTO tbl VALUES 
  ('A', 'Active', 1), ('A', 'Inactive', 2)
, ('B', 'Active', 4), ('B', 'Inactive', 5)
                    , ('C', 'Inactive', 7);  -- ('C', 'Active') is missing

简单形式 - 不适合缺失的属性

crosstab(text) with 1输入参数:

SELECT *
FROM   crosstab(
   'SELECT section, status, ct
    FROM   tbl
    ORDER  BY 1,2'  -- needs to be "ORDER BY 1,2" here
   ) AS ct ("Section" text, "Active" int, "Inactive" int);

Returns:



 Section | Active | Inactive
---------+--------+----------
 A       |      1 |        2
 B       |      4 |        5
 C       |      7 |           -- !!
  
  • 无需铸造和重命名。
  • 请注意不正确结果为C: 价值7已填写第一列。有时,这种行为是可取的,但不适合此用例。
  • 简单形式也仅限于exactly提供的输入查询中的三列:row_name, category, value。没有空间额外的列就像下面的 2 参数替代方案一样。

安全形式

crosstab(text, text) with 2输入参数:

SELECT *
FROM   crosstab(
   'SELECT section, status, ct
    FROM   tbl
    ORDER  BY 1,2'  -- could also just be "ORDER BY 1" here

  , $$VALUES ('Active'::text), ('Inactive')$$
   ) AS ct ("Section" text, "Active" int, "Inactive" int);

Returns:



 Section | Active | Inactive
---------+--------+----------
 A       |      1 |        2
 B       |      4 |        5
 C       |        |        7  -- !!
  
  • 请注意以下正确结果C.

  • The 第二个参数可以是任何返回 1 的查询row每个属性与末尾的列定义的顺序相匹配。通常您会想要从基础表中查询不同的属性,如下所示:

      'SELECT DISTINCT attribute FROM tbl ORDER BY 1'
    

这是手册上的。

由于无论如何您都必须拼写出列定义列表中的所有列(预定义的除外)crosstabN()变体),通常在一个简短的列表中提供一个更有效的方法VALUES表达式如所示:

    $$VALUES ('Active'::text), ('Inactive')$$)

或者(手册中没有):

    $$SELECT unnest('{Active,Inactive}'::text[])$$  -- short syntax for long lists
  • I used 美元报价使引用更容易。

  • 您甚至可以使用以下方式输出列不同的数据类型 with crosstab(text, text)- 只要值列的文本表示形式是目标类型的有效输入。这样你可能会有不同种类和输出的属性text, date, numeric等等各自的属性。文末有代码示例chapter crosstab(text, text)在手册中.

数据库小提琴here

过多输入行的影响

多余的输入行的处理方式不同 - 相同(“row_name”,“category”)组合的重复行 -(section, status)在上面的例子中。

The 1-参数表单从左到右填写可用值列。多余的值将被丢弃。
较早输入的行获胜。

The 2参数form 将每个输入值分配给其专用列,覆盖任何先前的分配。
后来输入的行获胜。

通常,一开始就没有重复项。但如果您这样做,请根据您的要求仔细调整排序顺序 - 并记录发生的情况。
或者如果您不在乎的话,可以快速获得任意结果。只要注意一下效果就可以了。

高级示例

  • 使用 Tablefunc 对多个列进行透视- 还展示了提到的“额外列”

  • 使用 CASE 和 GROUP BY 进行数据透视的动态替代方案


\crosstabview in psql

Postgres9.6将此元命令添加到其默认交互式终端psql。您可以运行首先使用的查询crosstab()参数并将其馈送到\crosstabview(立即或在下一步中)。喜欢:

db=> SELECT section, status, ct FROM tbl \crosstabview

与上面的结果类似,但它是客户端的表示功能只。输入行的处理方式略有不同,因此ORDER BY不需要。详细信息\crosstabview在手册中。该页面底部有更多代码示例。

Daniel Vérité(psql 功能的作者)在 dba.SE 上的相关回答:

  • 在结果表定义未知的情况下,如何生成枢轴交叉联接?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL 交叉表查询 的相关文章

  • 获取mysql中逗号分隔行中不同值的计数

    一个表 Jobs 有 2 列 JobId 城市 当我们保存工作时 工作位置可能是多个城市 如下所示 JobId City 1 New York 2 New York Ohio Virginia 3 New York Virginia 我如何
  • Oracle:按月分区表

    我的解决方案 德语几个月 PARTITION BY LIST to char GEBURTSDATUM Month PARTITION p1 VALUES JANUAR PARTITION p2 VALUES Februar PARTITI
  • Pandas 交叉表与 Pandas 数据透视表有何不同?

    两只熊猫的crosstab and pivot table函数似乎提供完全相同的功能 有什么区别吗 两者之间的主要区别是pivot table期望您的输入数据已经是一个 DataFrame 你将一个 DataFrame 传递给pivot t
  • 将自动增量列添加到按日期排序的现有表中

    我在数据库中有一个名为 tickets 的现有表 其中包含以下列 id string Primary Key contains UUID like e6c49164 545a 43a1 845f 73c5163962f2 date bigi
  • SQL Server 中离线索引重建和在线索引重建有什么区别?

    重建索引时 有一个选项ONLINE OFF and ONLINE ON 我知道当ONLINE模式打开时 它会复制索引 切换新查询以利用它 然后重建原始索引 使用版本控制跟踪两者的更改 如果我错了 请纠正我 但是 SQL 在离线模式下会做什么
  • PostgreSQL:删除数据库但数据库仍然存在[重复]

    这个问题在这里已经有答案了 我是 PostgreSQL 的新手 我尝试着理解它 我熟悉数据库和MySQL 我正在尝试删除我创建的数据库 因为 psql 似乎忽略了我尝试通过 Django 推送的更改 当我执行时 l我得到以下回复 List
  • 将 SQL Server 2008 DB 迁移到 Postgres [重复]

    这个问题在这里已经有答案了 我想将 SQL Server 2008 数据库迁移到 Postgres 有没有一种无痛的方法来做到这一点 是否有任何工具可以扫描架构和存储过程以标记兼容性问题 无痛http dbconvert com conve
  • 需要在 SQL Server 中透视字符串值

    我有一个包含值的表 描述为 Occupation String Name String Developer A Developer B Designer X Coder Y Coder Z 我需要数据透视格式的值 Designer Deve
  • Excel 2013 数据透视表不会更改当前页面,除非手动导航到

    我们有一小段 VBA 代码 多年来一直完美运行 本质上是 Me PivotTables APivot PivotFields AField CurrentPage Some text 这种方法一直有效 直到 Excel 2013 该行将失败
  • 如何关闭 gorm 1.20.0 中的数据库实例

    由于我没有在 Close 函数中找到 gorm 实例 任何帮助将不胜感激 dbURI fmt Sprintf user s password s dbname s port s sslmode s TimeZone s username p
  • Django 和 PostgreSQL - 值对于类型字符变化来说太长(512)

    我正在从测试 SQLite 数据库迁移到 PostgreSQL 数据库 我有一个插入到数据库中的示例对象 它在 SQLite 上工作 但在 PostgreSQL 中给我一个错误 代码片段是 car CarItem objects creat
  • MySQL NOT IN 来自同一个表中的另一列

    我想运行 mysql 查询来选择表中的所有行films其中的值title该列不存在于另一列的所有值中的任何位置 collection 这是我的表格的简化版本 其中包含内容 mysql gt select from films id titl
  • 如何将今天的日期返回到 Oracle 中的变量

    我想做这个 DECLARE today as smalldatetime SELECT today GetDate 但我需要一个oracle翻译 甲骨文使用SYSDATE 还有 ANSI 标准CURRENT TIMESTAMP 除其他外 S
  • JPA 支持查询 Postgres JSON 字段

    JPA 是否已经支持处理 JSON 字段的查询 如下所示 select from person where info gt gt age numeric 40 select from person where info gt gt firs
  • 使用 DISTINCT 进行查询需要很长时间

    我正在使用 Microsoft Access 2003 我的项目中的一个表单需要很长时间才能向用户显示 这是适用的查询 SELECT DISTINCT tb KonzeptDaten DFCC tb KonzeptDaten OBD Cod
  • 在 Yii 的标准中如何获得计数 (*)

    我正在尝试构建一个具有以下内容的查询group by属性 我正在尝试得到id和count它一直告诉我count is invalid列名 我怎样才能得到count来自group by询问 工作有别名 伊伊 1 1 11 其他不及格 crit
  • Oracle SQL PLS-00049:错误的绑定变量

    我收到此错误 这似乎是列拼写问题 然而 我 99 确信我拼写的所有内容都是正确的 但我看不出有任何理由会出现我所犯的错误 这是来源 CREATE OR REPLACE TRIGGER update qoh trigger AFTER INS
  • 重用 t-sql 游标的起始位置?

    我正在开发一个在临时表上使用游标的存储过程 我已经阅读了一些关于为什么不需要游标的内容 但在这种情况下我相信我仍然需要使用游标 在我的过程中 我需要遍历表的行两次 声明游标后 已经单步执行临时表并关闭游标 重新打开时游标的位置是否仍保留在表
  • SQL Server:如果存在会大大减慢查询速度

    正在使用SQL Server 2012 我找到了一些关于查询优化的主题 并将 EXISTS 与 COUNT 进行比较 但我找不到这个确切的问题 我有一个看起来像这样的查询 select from tblAccount as acc join
  • CONTAINS 不适用于 Oracle Text

    我在执行此查询时遇到问题 SELECT FROM gob attachment WHERE CONTAINS gob a document java gt 0 它给了我 ORA 29902 error in executing ODCIIn

随机推荐

  • 在 Angular 4/5 中编译动态 HTML - 类似于 Angular JS 中的 $compile

    我想通过对服务器的服务调用接收 HTML 数据 这是肯定的 我无法将模板保留在本地 并在内部操作它们以了解如何显示它 作为模态页面或完整页面 这个带有 Angular 标签的 HTML 应该循环到一个组件并一起工作 最多是 Angular
  • 没有公共继承的类之间的链式转换

    Question 我有一系列约 10 个模板类 A B C D 我想启用从一个类到该系列中以前的类的转换 D gt C B 或 A C gt B 或 A 乙 gt 甲 如何在不使用公共继承的情况下实现这一点 Test 1 公共继承 我不想继
  • 如何检查Chrome开发工具是否打开? [复制]

    这个问题在这里已经有答案了 I found in the tutorial on codeschool com discover devtools http discover devtools codeschool com chapters
  • ansible - 组合三个字典列表

    在我的剧本中 我从多个来源收集有关应用程序的事实 最终得到 3 个 或更多 列表 每个列表都有一个字典 有没有一种方法可以将这种结构合并到一个字典列表中 如果没有 关于我需要如何更改数据结构有什么建议吗 我尝试结合的代码2 字典列表 即使在
  • 从 csv 打印第一列时出现 Python 'KeyError: 0'

    我是 python 新手 尝试按列索引读取每一行 但得到KeyError 0执行以下代码时 with open processed test csv as f reader csv DictReader f for row in reade
  • 处理多态对象集合的正确设计模式

    假设我有以下课程 class BaseObject public virtual int getSomeCommonProperty class Object1 public BaseObject public virtual int ge
  • Python从项目列表创建字典键

    我希望使用 Python 字典来跟踪一些正在运行的任务 这些任务中的每一个都有许多使其独一无二的属性 因此我想使用这些属性的函数来生成字典键 以便我可以使用相同的属性再次在字典中找到它们 像下面这样 class Task object de
  • Spring Boot War 在 Jboss 7.1 上不起作用

    我正在尝试在 Jboss 上部署 Spring boot 应用程序 我跟随this将我的 jar 转换为 war 文件的教程 但是当我尝试在 Jboss 上运行应用程序时 它给了我这个错误 17 02 31 462 ERROR org ap
  • 如何让一个数成为幂呢?

    我的 JavaScript 有这个 A B C 其他的我都有了 但是我怎样才能有C作为力量呢 我认为使用 会起作用 但它只是添加它 JavaScript 没有求幂运算符 实际上是按位异或运算符 尝试使用Math pow反而 var d Ma
  • iOS 应用程序生命周期 4/3GS/iPad 与 2G/3G

    我读过苹果的文档关于应用程序生命周期并进行了一些测试以了解不同设备上的应用程序生命周期 除 2G 外均运行 iOS 4 x 我已经测试了具有 多任务处理 功能的设备与一些不支持此功能的设备 iPhone 2G 3G 应用程序生命周期 STA
  • 使用 python 编译 pin 工具时出错,出现错误 C2872:“UINT32”:不明确的符号

    我正在尝试编译 pin 工具Python h我收到了超过 100 个关于不明确符号的错误 我试图分开include到不同的命名空间 但它产生了许多其他错误 包含时也会发生同样的情况windows h 所有错误看起来都是这样的 D proj
  • 为什么这个承诺会悄然落空?

    db collection findOne是一个异步操作 MongoDB 但这在这里并不重要 这就是为什么我在这里将它包装在一个承诺中 var letsDoSomething new Promise function resolve rej
  • 代码可以在 jsfiddle 中运行,但不能在 html 文档中运行

    我是 javascript 的初学者 希望有人能帮助我解决这个问题 我正在尝试制作一个带有 id 的 div 移动 来回滑动 该代码在 jsfiddle 中工作 但当我将其放入 html 文档中时将无法工作 我尝试将顶部部分放在单独的 js
  • MySQL:从表中选择日期位于当前周和当前月的数据

    我正在创建一个网络应用程序 如果用户单击名为 WEEK 的链接 该页面会显示该周提交的所有帖子 还有一个选项可以查看本月提交的所有帖子 posts 表中有一个名为 post date 的列 其中日期的存储格式为 YYYY MM DD 我的问
  • Nodejs HTTP 和 HTTPS 通过同一端口

    我一直在谷歌搜索并在 stackoverflow 上查看 但找不到我喜欢的答案 我有一个通过 HTTPS 和端口 3001 运行的 NodeJS 服务器 现在我想获取端口 3001 上的所有传入 HTTP 请求 并将它们重定向到相同的 UR
  • 为什么使用切片克隆列表会影响原始列表

    下面是我将数组内的对象更改为字符串的代码 无法弄清楚为什么它会影响原始数组 slice 应该克隆数组 如果我是对的 var cloned scope selected items slice 0 cloned forEach functio
  • Hibernate - 外键而不是实体

    目前 Hibernate 允许我直接加载由 一对一关系定义的对象 entity1 getEntity2 是否可以获取外键而不是对象 我看到的当前方法是添加到我的映射中 JoinColumn name message key ManyToOn
  • 使用 while 循环遍历数组? - MIPS [重复]

    这个问题在这里已经有答案了 我想循环遍历一个数字数组 例如 word 2 2 2 2 2 2 2 2 2 2 2 2 2 word 2 2 2 2 2 2 2 2 2 2 2 2 2 word 2 2 2 2 2 2 2 2 2 2 2 2
  • Jenkins 使用 Groovy 读取 Jenkinsfile 中文件的特定行

    我正在尝试读取某行的特定行html詹金斯中的文件stage with Groovy并将其内容保存到环境变量中 问题是 File and readLines 不允许 我能够加载文件 env WORKSPACE pwd def file rea
  • PostgreSQL 交叉表查询

    如何在 PostgreSQL 中创建交叉表查询 例如我有下表 Section Status Count A Active 1 A Inactive 2 B Active 4 B Inactive 5 我希望查询返回以下交叉表 Section