当前位置: 首页 > 面试题库 >

GROUP BY或COUNT之类的字段值-UNPIVOT?

壤驷高旻
2023-03-14
问题内容

我有一个带有测试字段的表格,示例

id         | test1    | test2    | test3    | test4    | test5
+----------+----------+----------+----------+----------+----------+
12345      | P        | P        | F        | I        | P

因此,对于每条记录,我想知道有多少次通过,失败或不完整(P,F或I)

有没有一种方法可以按价值分组?

伪:

SELECT ('P' IN (fields)) AS pass
WHERE id = 12345

我有大约40个测试字段,我需要以某种方式将它们组合在一起,而我真的不想编写这个超级丑陋,冗长的查询。是的,我知道我应该将表重写为两个或三个单独的表,但这是另一个问题。

预期成绩:

passed     | failed   | incomplete
+----------+----------+----------+
3          | 1        | 1

有什么建议吗?

注意:我正在运行PostgreSQL 7.4,是的,我们正在升级


问题答案:

我可能想出了一个解决方案:

SELECT id
      ,l - length(replace(t, 'P', '')) AS nr_p
      ,l - length(replace(t, 'F', '')) AS nr_f
      ,l - length(replace(t, 'I', '')) AS nr_i
FROM   (SELECT id, test::text AS t, length(test::text) AS l  FROM test) t

技巧如下:

  • 将行类型转换为其文本表示形式。
  • 测量字符长度。
  • 替换要计算的字符并测量长度变化。
  • 计算子选择中原始行的长度,以供重复使用。

这就要求P, F, I该行中没有其他地方。使用子选择来排除可能干扰的任何其他列。

在8.4-9.1中测试。如今,没有人使用PostgreSQL
7.4,您必须进行自我测试。我仅使用基本功能,但不确定在7.4中将行类型强制转换为文本是否可行。如果这不起作用,则必须手工连接所有测试列一次:

SELECT id
      ,length(t) - length(replace(t, 'P', '')) AS nr_p
      ,length(t) - length(replace(t, 'F', '')) AS nr_f
      ,length(t) - length(replace(t, 'I', '')) AS nr_i
FROM   (SELECT id, test1||test2||test3||test4 AS t FROM test) t

这要求所有列都为NOT NULL



 类似资料:
  • 问题内容: 我有一个这样的数据框说 和会话和收入的每个值代表了一种类型的,我要统计每个种类的数量表示的数量和的为1。 在无法输出所需结果后,我发现简单的调用函数。 我怎样才能做到这一点? 问题答案: 您似乎想一次按几列分组: 应该给你你想要的

  • 主要内容:1 几种count查询的区别,2 优化COUNT()查询MySQL的count(*)、count(1) 和count(字段)的区别以及count()查询优化手段。 1 几种count查询的区别 count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数不是NULL,累计值就加1,否则不加。最后返回累计值。 count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),则

  • 我有列表有字段名称,货币和金额。我想按名称、货币和金额来分组。 我想要列表中的结果/输出

  • 我有一个数据集,需要通过groupby()找到每个唯一组合的计数。 我需要的是产生如下所示的输出: 尝试了以下代码: 此聚合引发“列表索引超出范围”错误。但是,当我从groupby子句中删除任何一列时,它就能够给出按剩余列分组的计数。 如果我删除as_index=False,则不会有错误,但结果对象将同时包含列make和body style作为索引的一部分,并且不会有任何计数数据。 我可以在dat

  • 问题内容: 1> 套装2排 2> 套装2排 3> 一组1行 为什么查询方式1>和2>会得到相同的结果?count(*)和count(somefiled)之间没有什么区别? 另外,查询2>和3>导致的结果不同,为什么 groupby 如此神奇?它是如何工作的? 更新:我正在使用MySQL5.1。:) 问题答案: 选择会给您一个结果集。如果按字段分组选择,则结果集的行将按该字段分组,并且结果集的每一行

  • 我需要将以下查询转换为hibernate条件查询。请帮忙 由于投票表上的复合主键,我用@Embeddable分隔了主键,所以后面的createQuery不起作用 和可嵌入对象 请建议一个更好的方法。