sql - Oracle sql中使用countif计算每一行

标签 sql oracle oracle11g

我可以知道是否有像Excel countif中那样的sql语句来根据条件计算高、中、低。

例如,下表显示了在 high 中使用 countif,我们可以看到每行 High 多少、low 多少、medium 多少

ID   Name     Value1     Value2     Value3    ValueN   High   Medium  Low
---  -------  ---------  ---------  --------  -------  -----  ------  ------
1    A        High       High       Low       Medium   2      1       1 
2    AB       Low        Medium     Low       High     1      1       2
3    ABC      High       Low        Low       High     2      0       2

最佳答案

您可以先使用UNPIVOT数据,然后进行条件聚合:

SELECT ID, Name,
       COUNT(CASE WHEN val = 'High' THEN 1 END)   AS High,
       COUNT(CASE WHEN val = 'Medium' THEN 1 END) AS Medium,
       COUNT(CASE WHEN val = 'Low' THEN 1 END)    AS Low
FROM tab
UNPIVOT( val FOR col_name IN (Value1, Value2, Value3, ValueN)) unpvt
GROUP BY ID, Name

LiveDemo

要处理更多列,只需将它们添加到:

val FOR col_name IN (Value1, Value2, Value3, ValueN)

最终查询包含原始选项卡中的所有列:

SELECT t.*, sub.High, sub.Medium, sub.Low
FROM tab t
JOIN (SELECT ID, Name, 
         COUNT(CASE WHEN val = 'High' THEN 1 END)   AS High,
         COUNT(CASE WHEN val = 'Medium' THEN 1 END) AS Medium,
         COUNT(CASE WHEN val = 'Low' THEN 1 END)    AS Low
      FROM tab
      UNPIVOT( val FOR col_name IN (Value1, Value2, Value3, ValueN)) unpvt
      GROUP BY ID, Name) sub
  ON t.ID = sub.ID

LiveDemo2

输出:

╔════╦══════╦════════╦════════╦════════╦════════╦══════╦════════╦═════╗
║ ID ║ Name ║ Value1 ║ Value2 ║ Value3 ║ ValueN ║ High ║ Medium ║ Low ║
╠════╬══════╬════════╬════════╬════════╬════════╬══════╬════════╬═════╣
║  1 ║ A    ║ High   ║ High   ║ Low    ║ Medium ║    2 ║      1 ║   1 ║
║  2 ║ AB   ║ Low    ║ Medium ║ Low    ║ High   ║    1 ║      1 ║   2 ║
║  3 ║ ABC  ║ High   ║ Low    ║ Low    ║ High   ║    2 ║      0 ║   2 ║
╚════╩══════╩════════╩════════╩════════╩════════╩══════╩════════╩═════╝

关于sql - Oracle sql中使用countif计算每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35753972/

相关文章:

sql - 触发器中的SQL ORACLE错误

mysql - 更新条件来自另一个表的表字段

在 pgAdmin 4 中停止作业的 SQL 命令

oracle - 字符集是来自用户还是数据库?

sql - ORA-00942 : table or view does not exist ( on another schema on same DB )

mysql - SQL语句获取查找表中的相似记录

sql - 如何用 SQL 表示关系除法(基本代数表达式)

java - 在 Java 中将 split to_char 语句从 Oracle 转换为 SQL Server

performance - 合并多个 Oracle 触发器。任何性能影响?

mysql - 如何将oracle TRUNC(SYSDATE-100 ,'Q')添加到MySQL