【问题标题】:SQL "COUNT" wrong results when JOINING more tablesJOINING 更多表时 SQL "COUNT" 错误结果
【发布时间】:2012-12-10 11:30:57
【问题描述】:

我的 SQL 查询有问题

我有

T1:

ID    STATUS   REPORTEDBY  
1     CLOSED   USER1
2     CLOSED   USER2
3     NEW      USER1
4     INPRG    USER1
5     CLOSED   USER1

T2:

T1ID  STATUS
1     NEW
1     CHECKING
1     CLOSED

2     NEW
2     CHECKING
2     CLOSED


3     NEW

4     CHECKING
4     INPRG 

5     INPRG
5     CLOSED

结果我想得到这个:

USER    NumberHasCHECKING  NumberDifferentFromNewChecking  NumberClosed

USER1          2                         3                      2
USER2          1                         1                      1

我想通过 REPORTEDBY 字段作为结果组

  1. T1 中在 T2 中存在 CHECKING 状态的记录数,

  2. T1 中现在处于不同于 T1 中 NEW 或 CHECKING 状态的记录数

  3. 以及 T1 中当前在 T1 中处于 CLOSED 状态的记录数。

.

select reportedby,count (case when T2.status='CHECKING' then 1 end) as NumberHasChecking,
count (case when T2.status not in ('NEW','CHECKING') then 1 end) as NumberDifferentFromNewChecking, 
count (case when T1.status='CLOSED' then 1 end) as  NumberClosed
from t1
inner join t2 on T1.ID=T2.T1ID
group by reportedby

但是在我进行内部连接之后,我在第二列和第三列得到了更好的结果。 如何解决这个问题? 谢谢

【问题讨论】:

  • 您的查询看起来不像是有效的 SQL。无论如何,对于左表中的所有匹配项,连接都会重复右表中的所有行。您可以使用子查询或count(distinct t3.id) 来计算唯一行数。

标签: sql count db2 inner-join


【解决方案1】:

不确定这是否适用于 DB2:

Select 
  ReportedBy,
  Count (Case When t2.Status = 'CHECKING' Then 1 End) As NumberHasChecking,
  Count (Distinct Case When t1.Status Not In ('NEW','CHECKING') Then t1.Id End) As NumberDifferentFromNewChecking, 
  Count (Distinct Case When t1.Status = 'CLOSED' Then t1.Id End) As NumberClosed
From
  t1
    Inner Join
  t2
    on t1.Id = t2.t1Id
Group By 
  ReportedBy

【讨论】:

    【解决方案2】:

    试试这个:

    select 
        reportedby,
        sum (T2.CheckingState) as NumberHasChecking, 
        count (case when T1.status not in ('NEW','CHECKING') then 1 end) as NumberDifferentFromNewChecking, 
        count (case when T1.status='CLOSED' then 1 end) as NumberClosed 
    from
        T1 inner join 
        (
            SELECT 
                T1ID,
                COUNT(CASE WHEN STATUS='NEW'      THEN 1 END) NewState,
                COUNT(CASE WHEN STATUS='CHECKING' THEN 1 END) CheckingState,
                COUNT(CASE WHEN STATUS='CLOSED'   THEN 1 END) ClosedState
            FROM T2
            GROUP BY T1ID
        ) T2 ON T1.ID=T2.T1ID 
    group by reportedby
    

    【讨论】:

      猜你喜欢
      • 2015-05-22
      • 1970-01-01
      • 2021-12-21
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2021-02-08
      • 1970-01-01
      相关资源
      最近更新 更多