从多个查询中编写单个查询

时间:2016-08-27 09:28:49

标签: sql-server

我有一个用列

的表格阅读
 [code]|[Test Mk]
  -----   -----
  1231  |  22.5
  1223  |  13.5
  1231  |  24.25
  1232  |  25.0
  ....    ....

当我像这样查询时

select [code], COUNT([code]) as Total 
from reading 
group by [code]

显示此结果

code    |Total
----     ----
1237    |728
1233    |698
1232    |701
1236    |651
1231    |655
1235    |626
1234    |636
1238    |685

当我像这样查询时再次

select [code], COUNT([code]) as FAIL 
from Reading 
where ROUND([Test Mk],0) < 24  
group by [code]

结果

code    | FAIL
----    | ----
1237    | 617
1233    | 422
1232    | 60
1236    | 81
1231    | 271
1235    | 517
1234    | 149
1238    | 69

当我像这样查询时再次

select [code], COUNT([code]) as PASS 
from Reading 
where ROUND([Test Mk],0) >= 24  
group by [code]

结果

code    | PASS
----    | ----
1237    | 111
1233    | 276
1232    | 641
1236    | 570
1231    | 384
1235    | 109
1234    | 487
1238    | 616

我想要一个以这种格式生成结果的查询

[code] | [Total] | [PASS] | [FAIL]
----     ----       ----     ----
 1231  |  125   |  100   |  25
 1232  |  200   |  150   |  50

我该怎么做

2 个答案:

答案 0 :(得分:1)

您需要使用Conditional Aggregation

要获得PASS计数,只需在ROUND([Test Mk],0) >= 24时计算行数。这可以这样实现。

Count(Case when ROUND([Test Mk],0) >= 24 then 1 END)

要获得FAIL计数,只需在ROUND([Test Mk],0) < 24时计算行数。这可以这样实现。

Count(Case when ROUND([Test Mk],0) < 24 then 1 END)
仅当行满足条件时,

Case语句才会生成1,否则它将放置NULL。 Count count会在计数时跳过NULL

整体查询

select [code], 
       COUNT([code]) as Total,
       Count(Case when ROUND([Test Mk],0) >= 24 then 1 END) as  PASS, 
       Count(Case when ROUND([Test Mk],0) < 24 then 1 END) as FAIL
from reading 
group by [code]

答案 1 :(得分:0)

SUM的另一种方式:

SELECT  [code], 
        COUNT([code]) as [Total],
        SUM(CASE WHEN ROUND([Test Mk],0) >= 24 THEN 1 ELSE 0 END) as [PASS], 
        SUM(CASE WHEN ROUND([Test Mk],0) < 24 THEN 1 ELSE 0 END) as [FAIL]
FROM reading 
GROUP BY [code]

还有一个(奇怪的):

;WITH [code] As(
    select [code], COUNT([code]) as Total 
    from reading 
    group by [code]
), [fails] AS (
    select [code], COUNT([code]) as [FAIL]
    from Reading 
    where ROUND([Test Mk],0) < 24  
    group by [code]
), [passed] AS (
    select [code], COUNT([code]) as [PASS ]
    from Reading 
    where ROUND([Test Mk],0) >= 24  
    group by [code]
)

SELECT  c.[code],
        c.[Total],
        f.[FAIL],
        p.[PASS]
FROM [code] c
LEFT JOIN [fails] f
    ON c.[code] = f.[code]
LEFT JOIN [passed] p
    ON c.[code] = p.[code]