【问题标题】:Retrieve matching rows using join使用连接检索匹配的行
【发布时间】:2013-10-15 07:10:41
【问题描述】:

这是我的问题的简化版本。

我有如下表

Id   Name       SNumber
100  XYZ        123
100  XYZ        123
101  ABC        123
103  QAZ        123
100  XYZ        971
100  XYZ        872
100  XYZ        659
102  PQR        145
102  PQR        707
103  QAZ        421

我想计算 Snumber 为 '123' 的行,即 Total 列和 Snumber 不为 '123' 的行,即 otherTotal

Id   Name       Total   OtherTotal
100  XYZ        2           3
101  ABC        1           0
102  PQR        0           2
103  QAZ        1           1

我正在做的是使用加入

Select xx.*,otherTotal
From
    ( Select Id,Name,count(*) as Total 
      From  table
      Where Snumber like '123'
      Group By id,name
     )xx

Inner join

     ( Select Id,Name,count(*) as otherTotal
      From  table
      Where Snumber not like '123'
      Group By id,name
     )yy

On xx.Id=yy.Id

但这只会在特定 IdSnumber123 并没有作为 123 时返回行

返回的数据如下

Id   Name       Total   OtherTotal
100  XYZ        2           3
103  QAZ        1           1

现在无法保证特定 ID 的 Snumber 始终为 123,因此我不能使用左连接或右连接。如何解决这个泥潭?吉吉特

【问题讨论】:

    标签: sql sql-server tsql sql-server-2005


    【解决方案1】:

    试试这个:

    SELECT id, name,
      COUNT(CASE WHEN SNumber = 123 THEN 1 END) Total,
      COUNT(CASE WHEN SNumber <> 123 THEN 1 END) OtherTotal
    FROM t
    GROUP BY id, name
    ORDER BY id
    

    小提琴here.

    【讨论】:

      【解决方案2】:
      select
          Id, Name,
          sum(case when SNumber = 123 then 1 else 0 end) as Total,
          sum(case when SNumber <> 123 then 1 else 0 end) as OtherTotal
      from Table1
      group by Id, Name
      order by Id
      

      select
          Id, Name,
          count(*) - count(nullif(SNumber, 123)) as Total,
          count(nullif(SNumber, 123)) as OtherTotal
      from Table1
      group by Id, Name
      order by Id
      

      sql fiddle demo

      【讨论】:

        【解决方案3】:

        试试这个。

        DECLARE @TABLE TABLE (ID INT,   NAME VARCHAR(40), SNUMBER INT)
        INSERT INTO @TABLE
        VALUES 
        (100  ,'XYZ',        123),
        (100  ,'XYZ',        123),
        (101  ,'ABC',        123),
        (103  ,'QAZ',        123),
        (100  ,'XYZ',        971),
        (100  ,'XYZ',        872),
        (100  ,'XYZ',        659),
        (102  ,'PQR',        145),
        (102  ,'PQR',        707),
        (103  ,'QAZ',        421)
        
        SELECT 
            ID, 
            NAME, 
            (
                SELECT 
                    COUNT(SNUMBER) FROM @TABLE B
                WHERE 
                    SNUMBER = '123' AND A.ID = B.ID
            ) AS TOTAL,
            (
                SELECT 
                    COUNT(SNUMBER) FROM @TABLE B
                WHERE 
                    SNUMBER <> '123' AND A.ID = B.ID
            ) AS OTHERTOTAL
        FROM 
            @TABLE A
        GROUP BY ID, NAME
        

        【讨论】:

          猜你喜欢
          • 2011-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-01
          • 2016-04-29
          • 1970-01-01
          • 2017-09-07
          • 2017-05-23
          相关资源
          最近更新 更多