【问题标题】:Oracle SQL - Pivot table count and with column might grow dynamicallyOracle SQL - 数据透视表计数和列可能会动态增长
【发布时间】:2021-07-02 06:08:54
【问题描述】:

我在 Oracle 18c 中有这张表:

+-----------+------------+------------------+
|    ID     |  Rule 1    | Rule 2  | Rule 3 |
+-----------+------------+------------------+
| ID001     | PASSED     | FAILED  | PASSED |
| ID002     | FAILED     | FAILED  | FAILED |
| ID003     | FAILED     | PASSED  | PASSED |
| ID004     | FAILED     | PASSED  | PASSED |
| ID005     | FAILED     | PASSED  | FAILED |
| ID006     | FAILED     | PASSED  | PASSED |
| ID007     | FAILED     | PASSED  | FAILED |
| ID008     | FAILED     | PASSED  | PASSED |
| ID009     | FAILED     | PASSED  | FAILED |
| ID010     | FAILED     | PASSED  | FAILED |
+-----------+------------+---------+--------+

我想将其转换为根据 ID 计数计算每个失败/通过的规则

预期结果如下:

+-----------+---------------------+
|   Rules   |  PASSED    | FAILED |
+-----------+---------------------+
| Rule 1    | 1          | 10     |
| Rule 2    | 8          | 2      |
| Rule 3    | 5          | 5      |
+-----------+------------+--------+

另外一个问题是,表将来可能会增长(添加更多列),并且查询应该能够在不进行任何更改的情况下处理它。

我怎样才能做到这一点?

【问题讨论】:

  • 修复你的数据模型!您将数据存储在应该位于不同行中的列中。
  • 我真的希望我能做到这一点,但现在这不是一个选择......
  • 。 .向表中添加新列会更改数据模型。
  • 必须是一条 SQL 语句吗?通常,如果您希望枢轴是动态的,您会创建一些动态创建枢轴查询的 PL/SQL。
  • 不,它不必是单个 SQL 语句...

标签: sql oracle pivot


【解决方案1】:

您可以使用数据透视,按规则分组并计算 PASSED 和 FAILED 的总和,如下所示:

select rules,
   sum(case when result = 'PASSED' then 1 else 0 end) PASSED,
   sum(case when result = 'FAILED' then 1 else 0 end) FAILED
from (
select * from yourTable
UNPIVOT(
  result
  FOR rules
  IN (
   "Rule 1" AS 'Rule 1',
   "Rule 2" AS 'Rule 2'
  )
))
group by rules;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2018-12-31
    • 2022-01-18
    相关资源
    最近更新 更多