【问题标题】:Oracle SQL: Join two queries into one result set using count() and group by()Oracle SQL:使用 count() 和 group by() 将两个查询连接到一个结果集中
【发布时间】:2020-12-02 05:28:54
【问题描述】:
  • 我有两个表可供选择和连接数据。
  • 两者共享对应的键值。
  • 第二个表的select语句应该count()和group by()值。

一个例子和预期的结果应该说明这种情况:

表一

| id  | rev | colour |
| --- | --- | ------ |
| 1   | a   | blue   |
| 2   | a   | green  |
| 1   | b   | grey   |

表二

| id  | rev | note     |
| --- | --- | -------- |
| 1   | a   | rejected |
| 1   | a   | removed  |
| 1   | b   | rejected |
| 1   | b   | rejected |
| 2   | a   | removed  |
| 2   | a   | removed  |

预期结果集的伪 SQL

t1.id, t1.rev, t1.colour, t2.count(rejected), t2.count(removed)

预期结果

| id  | rev | colour | rejected | removed |
| --- | --- | ------ | -------- | ------- |
| 1   | a   | blue   | 1        | 1       |
| 2   | a   | green  | 0        | 2       |
| 1   | b   | grey   | 2        | 0       |

在一条 SQL 语句中实现这一点的最佳方法是什么? 我想我应该使用两个子选择并加入它们。不知道怎么样 放入count(), group by() 并加入这里。

感谢您的想法!

【问题讨论】:

    标签: sql oracle join count subquery


    【解决方案1】:

    我认为您只需要聚合和join。我会这样处理:

    select *
    from table1 t1 left join
         (select id, rev,
                 sum(case when note = 'rejected' then 1 else 0 end) as rejected,
                 sum(case when note = 'removed' then 1 else 0 end) as removed
          from table2 t2
          group by id, rev
         ) t2
         using (id, rev);
    

    在子查询中进行聚合并使用using 子句可以方便地从table1 中选择所有列,而不必列出所有列。

    【讨论】:

    • 在这种情况下使用 count 比 sum 更清楚,并且 count 永远不会返回 null。计数(注释“被拒绝”然后 1 结束的情况)
    • @akk0rd87 。 . .在这些情况下,我更喜欢sum(),因为else 子句会抛出count()。另外,count(2) = count(1) 我认为向学习 SQL 的人解释这很令人困惑。
    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多