使用 CASE WHEN 在 postgresql 中创建数据透视表的正确方法

2023-11-22

我正在尝试在 postgresql 中创建一个数据透视表类型视图,并且已经快到了!这是基本查询:

select 
acc2tax_node.acc, tax_node.name, tax_node.rank 
from 
tax_node, acc2tax_node 
where 
tax_node.taxid=acc2tax_node.taxid and acc2tax_node.acc='AJ012531';

和数据:

   acc    |          name           |     rank     
----------+-------------------------+--------------
 AJ012531 | Paromalostomum fusculum | species
 AJ012531 | Paromalostomum          | genus
 AJ012531 | Macrostomidae           | family
 AJ012531 | Macrostomida            | order
 AJ012531 | Macrostomorpha          | no rank
 AJ012531 | Turbellaria             | class
 AJ012531 | Platyhelminthes         | phylum
 AJ012531 | Acoelomata              | no rank
 AJ012531 | Bilateria               | no rank
 AJ012531 | Eumetazoa               | no rank
 AJ012531 | Metazoa                 | kingdom
 AJ012531 | Fungi/Metazoa group     | no rank
 AJ012531 | Eukaryota               | superkingdom
 AJ012531 | cellular organisms      | no rank

我想要得到的是以下内容:

acc      | species                  | phylum
AJ012531 | Paromalostomum fusculum  | Platyhelminthes

我正在尝试使用 CASE WHEN 来做到这一点,所以我已经做到了以下几点:

select 
acc2tax_node.acc, 
CASE tax_node.rank WHEN 'species' THEN tax_node.name ELSE NULL END as species, 
CASE tax_node.rank WHEN 'phylum' THEN tax_node.name ELSE NULL END as phylum 
from 
tax_node, acc2tax_node 
where 
tax_node.taxid=acc2tax_node.taxid and acc2tax_node.acc='AJ012531';

这给了我输出:

   acc    |         species         |     phylum      
----------+-------------------------+-----------------
 AJ012531 | Paromalostomum fusculum | 
 AJ012531 |                         | 
 AJ012531 |                         | 
 AJ012531 |                         | 
 AJ012531 |                         | 
 AJ012531 |                         | 
 AJ012531 |                         | Platyhelminthes
 AJ012531 |                         | 
 AJ012531 |                         | 
 AJ012531 |                         | 
 AJ012531 |                         | 
 AJ012531 |                         | 
 AJ012531 |                         | 
 AJ012531 |                         | 

现在我知道我必须在某个时候按 acc 进行分组,所以我尝试

select 
acc2tax_node.acc, 
CASE tax_node.rank WHEN 'species' THEN tax_node.name ELSE NULL END as sp, 
CASE tax_node.rank WHEN 'phylum' THEN tax_node.name ELSE NULL END as ph 
from 
tax_node, acc2tax_node 
where 
tax_node.taxid=acc2tax_node.taxid and acc2tax_node.acc='AJ012531' 
group by acc2tax_node.acc;

但我得到了可怕的

ERROR:  column "tax_node.rank" must appear in the GROUP BY clause or be used in an aggregate function

我发现的所有前面的示例都在 CASE 语句周围使用了类似 SUM() 的东西,所以我猜这就是聚合函数。我尝试过使用 FIRST():

select 
acc2tax_node.acc, 
FIRST(CASE tax_node.rank WHEN 'species' THEN tax_node.name ELSE NULL END) as sp, 
FIRST(CASE tax_node.rank WHEN 'phylum' THEN tax_node.name ELSE NULL END) as ph 
from tax_node, acc2tax_node where tax_node.taxid=acc2tax_node.taxid and acc2tax_node.acc='AJ012531' group by acc2tax_node.acc;

但出现错误:

ERROR:  function first(character varying) does not exist

任何人都可以提供任何提示吗?


使用 MAX() 或 MIN(),而不是 FIRST()。在这种情况下,每个组值的列中都将包含所有 NULL,最多除了一个非空值之外。根据定义,这既是该组值的最小值又是最大值(排除所有空值)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CASE WHEN 在 postgresql 中创建数据透视表的正确方法 的相关文章

  • SQL Server 如何查看日期是否为当前月份?

    我有一个Ticket Date格式为的列YYYY MM DD HH MI SS 我想检查是否Ticket date是在当前月份 到目前为止我有 Ticket date gt 2015 04 01 and Ticket date lt 201
  • Web SQL 将数据插入多行

    我尝试在 Web SQL 数据库中一次将变量插入多行 但使用我所知的所有方法时 我收到错误 INSERT INTO tab a b VALUES v1 v2 v3 v4 gt gt could not prepare statement 1
  • CHAR(64) 或 BINARY(32) 在 SQL SERVER 中存储 SHA256 哈希

    我正在讨论在 SQL Server 中存储 SHA256 哈希时使用哪种数据类型 应该是 CHAR 64 还是 BINARY 32 该列将成为唯一聚集索引的一部分 我知道此时我可能会吹毛求疵 但是我想第一次就把这件事做好 而且我知道有时原始
  • 将日期时间列拆分为年、月和周

    我想拆分日期时间列 以便年份和月份在 select 语句输出中都有自己的列 我还希望有一个按一年中的一周而不是特定日期的专栏 基本上 我希望单独的年 月和周列显示在我的 select 语句输出中 尝试使用DatePart http msdn
  • 两个表中两个字段的总和

    我的数据库中有四个表 如下所示 表格发票 invcid customerid invoicedate tblInvc详细信息 ID invcid item itemprice itemquantity tblPay payid invcid
  • MySQL select with 语句

    我正在学习更多 SQL 并遇到了一个 问题 我有两个表 如下面的链接http www sqlfiddle com 2 403d4 1 http www sqlfiddle com 2 403d4 1 编辑 由于我这个周末所做的所有 SQL
  • Mysql 更快的 INSERT

    好的 我有大约 175k 个 INSERT 语句 相当大的 INSERT 语句 例如 INSERT INTO gast ID Identiteitskaartnummer Naam Voornaam Adres Postcode Stad
  • 如何使用JSqlParser向sql添加where条件?

    我想用JSqlParser向sql添加where条件 例如 Before select from test table where a 1 group by c After select from test table where a 1
  • 如何在 SQL 中引用自定义字段

    我正在使用 mssql 但在使用子查询时遇到问题 真正的查询相当复杂 但其结构与此相同 select customerName customerId select count from Purchases where Purchases c
  • 将 2 个不同表中的 2 个值相乘

    我正在尝试使用 SQL 将值 X 乘以值 Y 值 X 位于表 A 中 B 位于表 B 中 我找不到这个问题的答案 表交易 ID Transaction ID Total Amount 1 001 1200 2 002 1500 3 003
  • 无法从 CursorWindow 读取第 0 行,第 -1 列?

    我在使用数据库时遇到问题 当我运行 SQLView java 时 出现致命异常 java lang RuntimeException Unable to start activity ComponentInfo com jacob eind
  • 选择列的一部分

    我想知道是否有人可以帮助查询以选择列的一部分 criteriadata 列包含如下所示的数据 标准数据 14 27 15 14 30 15 DD 14 38 15 通过 14 33 15 通过 如何只选择数字 15 之后出现的数据 非常感谢
  • PostgreSQL ISOLATION LEVEL 生效的时间似乎是在第一次 SELECT 之后

    我正在运行 PostgreSQL 9 5 3 我试图理解为什么我看到下面两个例程之间的行为差 异 我发现这种行为违反直觉 但可能有一个很好的理由 我只是想知道如果是的话那是什么 Setting ISOLATION LEVEL REPEATA
  • Oracle PLSQL 将日期时间截断为 15 分钟块

    我想将我的数据聚合成 15 分钟的片段 一刻钟 为此 我编写了一些生成 15 分钟日期时间块的代码 SELECT TRUNC SYSDATE hh 0 25 24 ROWNUM 0 25 24 AS time start ROWNUM TR
  • Rails (PostgreSQL) 中文本列的默认大小

    如果我在迁移中有这个 t text body 我可以容纳多少文字 body 如果相关的话我正在使用 PostgreSQL 直接来自PostgreSQL 文档 http www postgresql org docs 8 4 static d
  • Oracle 奇怪的 SUM 行为

    我有两个查询 据我了解 这两个查询应该提供相同的结果 但事实并非如此 显然我在这里遗漏了一些重要的观点 我希望你能帮助我 查询 我认为这是错误的 SELECT SUM a amount AS A SUM 10 727 470 FROM bi
  • 单笔交易与多笔交易[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 会员提供商使用还是不使用?

    我正在开发一个使用 Facebook 的网站 现在为了管理用户我想使用MembershipProvider并选择开发一个定制的会员提供商 我的问题是我的数据库架构与标准成员资格架构不匹配 并且提供的用于覆盖的函数采用与我预期不同的参数 例如
  • Postgres jsonb 使用更大的运算符在数组中搜索(使用 jsonb_array_elements)

    我尝试寻找解决方案 但没有找到适合我的情况的任何内容 这是数据库声明 简化 CREATE TABLE documents document id int4 NOT NULL GENERATED BY DEFAULT AS IDENTITY
  • 当我将 xx 添加到 mysql float 列时,结果错误,这是一个错误吗?

    我的mysql 5 6 16 我的餐桌信息 CREATE TABLE xxx uid int 11 NOT NULL money float 10 2 NOT NULL DEFAULT 0 00 real money float 10 2

随机推荐

  • 如何将 QBASIC PLAY 命令转换为更现代的命令?

    我的 QB 应用程序中有这样的播放命令 PLAY MSe8f 4f 8f 8g8a8b4 a4 g4 f 4 o0b8o1e8e8e4d8e2 我想以某种方式将它们转换为现代应用程序可以使用的东西 有什么想法吗 我目前正在 FreeBasi
  • min_member/2 的反直觉行为

    最小成员 分钟 列表 当 Min 是标准项顺序中最小的成员时为真 如果列表为空 则失败 min member 3 1 2 X X 3 当然 解释是变量在术语的标准顺序中位于所有其他术语之前 并且使用统一 然而 所报告的解决方案感觉有些错误
  • 如何将查询结果映射到 sqlalchemy 中的自定义对象?

    我正在寻找一种方法来告诉 sqlalchemy 将某些 tabes 上的复杂查询映射到自定义类MyResult而不是默认的RowProxy班级 这是一个简单的工作示例 create table foo id integer title te
  • itunesconnect apploader 无效段对齐问题

    伙计们 我想更新我的应用程序最新版本 但应用程序加载器一直给我同样的错误 那就是 错误 ITMS 9000 段对齐无效 此应用程序没有正确的段对齐 应使用最新版本的 Xcode 重新构建 如果您需要进一步帮助 请联系开发者技术支持 我快要疯
  • 防止 ProgressDialog 被 onClick 关闭

    我使用 ProgressDialog 向用户表明他必须等待 并在用户必须等待时使我的应用程序的表面 不可触摸 我向 ProgressDialog 添加了一个按钮 如果某些条件成立 它应该启动一些操作 问题是每次用户按下按钮时 progres
  • Java滑动JPanels

    我有一个显示各种按钮的菜单 我可以让按钮在单击时调用它们各自的 JPanel 问题是我想让 Jpanel 在调用时滑入 而不是立即弹出 我尝试使用补间引擎 作为 Java 初学者 我发现它真的让人不知所措 所以我决定使用定时动画 我能够使顶
  • Kafka Streams如何获取kafka headers

    我有下面的卡夫卡流代码 public class KafkaStreamHandler implements Processor
  • Rails ActiveRecord 创建或查找

    我正在开发 Rails 4 应用程序 在我的 api 的 post 方法中 我想根据用户尝试创建的内容查找记录 如果它不存在 则创建它 如果它确实更新它的参数有 我编写了一些实际执行此操作的代码 但执行起来需要一些时间 有没有其他方法可以用
  • 从 SSRS 2005 (VB.NET) 中的字符串中去除 HTML

    my SSRS数据集返回一个 HTML 字段 例如 b blah blah b i blah i 如何去除所有 HTML 标签 必须完成inline VB NET 更改表中的数据不是一种选择 找到解决方案 System Text Regul
  • 调整背景图像大小以适合

    我试图使背景图像尽可能专业 所以我认为最好根据浏览器的大小或分辨率调整它的大小 不确定通常使用什么 但我认为浏览器大小在这里有意义 这个想法是 如果查看器屏幕较小 则背景图像会变小 并且随着屏幕变大 图像会扩展以适合其最大尺寸 我会根据需要
  • Phylo BioPython 构建树木

    I trying to build a tree with BioPython Phylo module What I ve done so far is this image 每个名称都有一个四位数字 后跟 和一个数字 该数字指的是该序列
  • 动态更改选项卡文本标题

    我在 viewpager 下有一个带有四个选项卡的选项卡 我想在滑动选项卡时更改文本标题 我的问题是我无法分别处理选项卡 例如四个选项卡标题是 1 2 3 4 当我滑动时 它会显示为 1 9 3 4 或 1 2 9 4 但在我的例子中是 7
  • 从 aov 中提取 p 值

    我正在寻找从 R 中的方差分析生成的 p 值 这是我正在运行的 test lt aov asq 9 asq 187 summary test Yields Df Sum Sq Mean Sq F value Pr gt F asq 187
  • 如何避免在番石榴中延迟应用Lists.transform?

    Map
  • 使用命令输出中引用的条目在 Bash 中创建数组

    我在从标准输出形成 bash 数组时遇到问题 我把它归结为这个最小的例子 a echo 1 2 3 foo bar echo a 0 1 echo a 1 2 echo a 2 3 echo a 3 foo echo a 4 bar 我相信
  • 在 Julia 中检索 RNG 种子

    在 Julia 中 全局 RNG 的种子可以设置为 srand SEED 我如何检索全局 RNG 的种子或当前状态 例如稍后再来一次 目标是在任何给定时间点获取 RNG 的状态 并在不同的会话中重新创建它 而无需知道初始种子或同时发生的对
  • 关于linux设备驱动中的register_chrdev_region()的问题

    我正在学习如何注册内核模块register chrdev region dev t from unsigned count const char name 我注意到无论有没有这个函数 我的内核模块都按预期工作 我用于测试的代码 first
  • 如何使用 IIS 7.5 更改可以在表单中发布的字段数量?

    我们的网络应用程序的管理部分中的某些表单遇到了问题 有少数表单包含大量字段 范围可以从一个输入字段到数百个 我们发现 随着这些表单的增长 在发布表单时 服务器会抛出 500 个错误 经过测试 我发现服务器可以处理包含 100 个字段的表单
  • 单个单元格的计数器增量

    这篇文章源于我的问题将单元定义扩展到单元框架标签 我一直在玩CounterIncrements我没有得到我所期望的 正如西蒙在对我提到的帖子的回答中所做的那样 我们首先生产一个计数器 CellPrint Cell Setting the c
  • 使用 CASE WHEN 在 postgresql 中创建数据透视表的正确方法

    我正在尝试在 postgresql 中创建一个数据透视表类型视图 并且已经快到了 这是基本查询 select acc2tax node acc tax node name tax node rank from tax node acc2ta