【问题标题】:How to join and count with multiple condition in oracle如何在oracle中加入和计算多个条件
【发布时间】:2019-11-29 10:30:50
【问题描述】:

我有 2 张桌子:

table1(id, name)
1233    AAA
3424    BBB
4345    CCC
4342    DDD
1243    RRR
3453    GGG

table2(id,date,status)
1233    01/07/19    1
3424    01/07/19    1
4342    01/07/19    2
1243    01/07/19    1
4342    01/07/19    1
4345    02/07/19    2
1243    02/07/19    1
1233    02/07/19    1
4345    03/07/19    1
4342    03/07/19    2
1233    03/07/19    1
4342    04/07/19    2
4345    04/07/19    2
4342    04/07/19    1
1243    04/07/19    2

15 行

我试过这个代码

SELECT    rn.id, name, NVL(cnt, 0) jum
    FROM     table1 rn
    LEFT JOIN (SELECT   id, COUNT(id) AS cnt
               FROM     VIEW_AKTIFITAS
               WHERE extract(year from date)=2019
               AND extract(month from date)=7
               GROUP BY id,extract(month from date) n ON n.id= rn.id

我想得到这个结果 如何统计表2中的状态条目

RESULT
ID  COUNT_STATUS_1 COUNT_STATUS_2 TOTAL_COUNT
1233    2           0       2
3424    2           0       2
4345    1           2       3 
4342    2           3       5
1243    2           1       3
3453    0           0       0

请帮我解决这个问题..谢谢

【问题讨论】:

  • 对于第一个 id 1233,我计算了状态为 1 的三行。为什么您的“期望结果”显示 2 而不是 3?这只是一个错误,还是我误解了问题?
  • 这只是我的错误.. ^_^

标签: sql oracle join count


【解决方案1】:

这是我的最终代码

SELECT t1.nip, t1.nama_pegawai,
           count(CASE
                   WHEN t2.status = 1 
                    and t2.tahun=2019
              and t2.bulan=7
                   THEN
                     1
                 END) count_status_1,
           count(CASE
                   WHEN t2.status = 2 
                    and t2.tahun=2019
              and t2.bulan=7
                   THEN
                     1
                 END) count_status_2,
           count(CASE
           WHEN  t2.tahun=2019
              and t2.bulan=7
              THEN 1 END
            ) total_count
           FROM VIEW_PEGAWAI t1
                LEFT JOIN VIEW_AKTIFITAS t2
                          ON t2.nip = t1.nip
              where t1.opd_id=14  
              and T1.JENIS_PEG<>3

                          group by t1.nip,t1.nama_pegawai

【讨论】:

    【解决方案2】:

    根据您的示例代码,您似乎想要:

    SELECT rn.id, rn.name, NVL(cnt, 0) jum,
           SUM(CASE WHEN a.status = 1 THEN 1 ELSE 0 END) as status_1,
           SUM(CASE WHEN a.status = 1 THEN 1 ELSE 0 END) as status_2,
           COUNT(a.status) as total
    FROM table1 rn LEFT JOIN
         VIEW_AKTIFITAS a
         ON a.id = rn.id AND
            a.date >= DATE '2019-07-01' AND
            a.date < DATE '2019-08-01'
    GROUP BY rn.id, rn.name;
    

    您不需要LEFT JOIN 的子查询。使用直接日期比较可以更好地完成日期比较。 Oracle 允许您使用带有 DATE 关键字的 ISO 标准日期格式。

    【讨论】:

      【解决方案3】:

      在 Oracle 11.1 及更高版本中,您可以使用 PIVOT 运算符进行聚合。像这样的:

      select id, name, count_status_1, count_status_2, 
             count_status_1 + count_status_2 as total_count
      from   (select t1.id, t1.name, t2.status from table1 t1 left join table2 t2
                                                              on t1.id = t2.id)
      pivot  (count(*) for status in (1 as count_status_1, 2 as count_status_2))
      order  by id   --  if needed
      ;
      

      【讨论】:

        【解决方案4】:

        table2 左连接到table1,然后使用条件聚合来获取两种状态的不同计数。

        SELECT t1.id,
               count(CASE
                       WHEN t2.status = 1 THEN
                         1
                     END) count_status_1,
               count(CASE
                       WHEN t2.status = 2 THEN
                         1
                     END) count_status_2,
               count(t2.status) total_count
               FROM table1 t1
                    LEFT JOIN table2 t2
                              ON t2.id = t1.id;
        

        【讨论】:

        • 谢谢你最终得到我需要的结果。这是我的最终查询
        猜你喜欢
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 2014-05-14
        • 2021-03-18
        • 2016-02-03
        • 1970-01-01
        • 2021-07-31
        相关资源
        最近更新 更多