9

異なるwhere句に基づいて、同じテーブルから合計レコード、成功レコード、および失敗レコードを返す3つのselectクエリがあります。ストアドプロシージャを作成するために、これらすべてのステートメントの結果を1つのテーブルに結合したいのですが、結果のテーブルには、cdr、success、failureの3つの異なる列があります。

SELECT Count(*) AS cdr 
FROM   ABC AS c WITH (NOLOCK) 
WHERE  APPID IN( 1, 2 ) 
       AND CALLDATE = '2012-10-09' 

SELECT Count(*) AS success 
FROM   ABC AS d WITH (NOLOCK) 
WHERE  APPID IN( 44, 45 ) 
       AND CALLDATE = '2012-10-09' 
       AND HANGUPCODE IN ( 'man', 'mach' ) 

SELECT Count(*) AS fail 
FROM   ABC WITH (NOLOCK) 
WHERE  APPID IN( 44, 45 ) 
       AND CALLDATE = '2012-10-09' 
       AND HANGUPCODE NOT IN ( 'man', 'mach' ) 

Unionは結果を1つの列に表示するため、機能しません。その他のアイデア

4

4 に答える 4

26

各selectステートメントを括弧で囲み、各selectステートメントにエイリアスを付けSELECTて、上部で使用するだけです。

SELECT 
  (select count(*) as cdr  
   from abc as c with (nolock) 
   where appid in(1,2)  and calldate = '2012-10-09'
  ) AS Column1,  
  (select count(*) as success  
   from abc as d with (nolock) 
   where appid in(44,45) and calldate = '2012-10-09' 
       and hangupcode in ('man', 'mach')
  ) AS Column2, 
  (select count(*) as fail  
   from abc  with (nolock) 
   where appid in(44,45) and calldate = '2012-10-09' 
       and hangupcode not in  ('man', 'mach')
  ) AS Column3

基本的に、各クエリを個別の列として扱います。

于 2012-10-16T18:38:29.983 に答える
2
  SELECT a.cdr, b.success, c.failure FROM 
  (SELECT count(*) AS cdr  
   FROM abc as c WITH (NOLOCK) 
   WHERE appid IN (1,2) AND
         calldate = '2012-10-09'
  ) AS a,   
  (SELECT count(*) AS success  
   FROM abc AS d WITH (NOLOCK) 
   WHERE appid IN (44,45) AND 
         calldate = '2012-10-09' AND 
         hangupcode IN ('man', 'mach')
  ) AS b,  
  (SELECT count(*) AS fail  
   FROM abc WITH (NOLOCK) 
   WHERE appid IN (44,45) AND
         calldate = '2012-10-09' AND 
         hangupcode NOT IN ('man', 'mach')
  ) AS c
于 2012-10-16T18:39:17.247 に答える
1
select a.cdr, b.success, c.fail from
( select count(*) as cdr  
from abc as c with (nolock) where appid in(1,2)  
and calldate = '2012-10-09' ) a
, ( select count(*) as success  
from abc as d with (nolock) where appid in(44,45)  
and calldate = '2012-10-09'
and hangupcode in ('man', 'mach') ) b
, ( select count(*) as fail  from abc  with (nolock) where appid in(44,45) and calldate = '2012-10-09'and hangupcode not in  ('man', 'mach') ) c
于 2012-10-16T18:39:17.490 に答える
1
select
   sum(case when appid in(1,2) and calldate = '2012-10-09' then 1 else 0 end) as cdr,
   sum(case when appid in(44,45) and calldate = '2012-10-09'and hangupcode in ('man', 'mach') then 1 else 0 end) as success,
   sum(case when appid in(44,45) and calldate = '2012-10-09'and hangupcode not in  ('man', 'mach') then 1 else 0 end)as fail
from abc 
于 2012-10-16T18:45:44.070 に答える