【问题标题】:Filtering in joins在连接中过滤
【发布时间】:2018-10-17 19:50:40
【问题描述】:

我有两张桌子。

表 1

 ----RID---Name-----
      1     Process1
      2     Process2

表 2

  -----RID------URID-----Status-----
       1         1        0
       1         2        1
       1         3        3
       2         4        0

我想为表 1 中的每个名称计算表 2 中的所有错误(状态 >1)、所有成功(状态

 -----RID----Success------Errors---
       1        2            1
       2        1            0

这是我正在尝试使用的查询,但它不起作用......认为已经在连接中过滤会很聪明......我在这里做错了什么?

 select distinct T1.[Name]
 ,count(T2.URID) as Error
 ,count(T3.URID) as Success
 FROM [dbo].[Table 1] T1
 left join [dbo].[Table 2] T2
 on T2.RID = T1.RID and T2.Status > 1
 left join [dbo].[Table 2] T3
 on T3.RID = T1.RID and T3.Status < 2
 group by RID   

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 不需要加入表格吧?

标签: sql join filter


【解决方案1】:

你也可以像下面这样实现,

 SELECT * INTO #T FROM (SELECT CASE WHEN T.[STATUS]>1 THEN COUNT(T.[STATUS]) ELSE 0 END [ERROR],
 CASE WHEN T.[STATUS]<2 THEN COUNT(T.[STATUS]) ELSE 0 END [SUCCESS],
 T2.NAME FROM TEST1 T2 INNER JOIN TEST2 T ON T.RID=T2.RID
 GROUP BY T.[STATUS],T2.[NAME]) T


 SELECT NAME,SUM([SUCCESS]) [SUCCESS],SUM(ERROR)[ERROR] FROM #T GROUP BY NAME

【讨论】:

    【解决方案2】:

    你可以做聚合:

    select  t1.rid, t1.name,
            sum(case when status > 1 then 1 else 0 end) as error, 
            sum(case when status < 2 then 1 else 0 end) as success 
    from table1 t1 inner join
         table2 t2
         on t2.rid = t1.rid
    group by t1.rid, t1.name
    

    但是,如果您有 GROUP BY 子句,则此处不需要 DISTINCT

    【讨论】:

      【解决方案3】:

      使用条件聚合:

      select T1.[Name],
             sum(case when t2.status > 1 then 1 else 0 end) as errors,
             sum(case when t2.status < 2 then 1 else 0 end) as success
      from [dbo].[Table 1] T1 left join
           [dbo].[Table 2] T2
           on T2.RID = T1.RID
      group by T1.RID, T1.[Name];
      

      按用于定义每一行T1.Name 的列进行聚合也很重要。我不确定group by 中是否需要T1.RID,但您的版本中有它。

      【讨论】:

        【解决方案4】:

        这将起作用:

        create table ns_999(col1 number,col2 number,col3 number);
        
         insert into ns_999 values( 1,1,0);
         insert into ns_999 values(1,2 ,1);
         insert into ns_999 values(1,3,3);
          insert into ns_999 values(2,4,0);
          SELECT * FROM ns_999;
        
          select col1,
               sum(case when col3>1 then 1 else 0 end ) as errors, 
               sum(case when col3<2 then 1 else 0 end) as sucess
        from ns_999 
        group by col1;
        

        样本输出:

         RID FALIURE SUCCESS 
            1      1       2
            2      0       1
        

        【讨论】:

          猜你喜欢
          • 2011-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-05
          • 2011-01-11
          • 1970-01-01
          • 2023-01-11
          • 2010-10-13
          相关资源
          最近更新 更多