0

SQL レポート ビルダーを使用しており、ターンアラウンド タイム内の割合を計算したい

私のテーブルは次のようになります

Name  count  within tat
jeff   1      1
jeff   1      0
jeff   1      1
jeff   1      0

私はそれがこのように見えることを望みます。

Name  count  within tat
jeff   4     2 (50%)  

tat内で計算するために使用するコードは

case
when (convert(Decimal(10,2),
    (cast(datediff(minute,
        (CAST(RequestDate AS DATETIME) + CAST(RequestTime AS DATETIME)), 
    REQUEST_TESTLINES.AuthDateTime)as float)/60/24))) > 
    EXP_TAT then '1' else '0' end as [withintat]

この列を合計するにはどうすればよいですか?

4

4 に答える 4

0

はい、sum() 内で case ステートメントを使用できます

しかし、それは数値を返す必要があります..

あなたの「タット内」を次のようなものに変更します

select case when (convert(Decimal(10,2),
                 (cast(datediff(minute,
                 (CAST(RequestDate AS DATETIME) + CAST(RequestTime AS DATETIME)), 
                 REQUEST_TESTLINES.AuthDateTime)as float)/60/24))) > 
                 EXP_TAT 
            then 1 
            else 0 end as [withintat]
        ....

ただし、合計とパーセンテージが必要な場合。

この値を 2 回使用する必要があります。

複製コードを保持したくないと確信しています。

したがって、実際のクエリをサブクエリとして使用して、合計することをお勧めします...

本当にサブクエリとして使用したくない場合

次のようにして、outer apply を使用して intat の値を収集する必要があります。

 select Name
       ,count(*) as [count]
       ,sum(OA.[withintat]) as [withintat]
       ,sum(OA.[withintat])*100/count(*) as [percent]
       ,cast(sum(OA.[withintat]) as varchar(max))+' ('+cast(sum(OA.[withintat])*100/count(*) as varchar(max))+' %)' as [withintat_and_percent]
 from your_actual_query
 outer apply(select case when (convert(Decimal(10,2),
                              (cast(datediff(minute,
                              (CAST(RequestDate AS DATETIME) + CAST(RequestTime AS DATETIME)), 
                              REQUEST_TESTLINES.AuthDateTime)as float)/60/24))) > EXP_TAT 
            then 1 
            else 0 end as [withintat]
 )OA
 where ....
于 2013-01-23T18:43:48.490 に答える
0

別の でラップできますSELECT

SELECT SUM(count), SUM(withintat)
FROM (/*Your original query*/)
于 2013-01-23T18:12:11.220 に答える
0

あなたはそのようなものを探していますか?

select name , sum(count) total, sum(within_tat)*100 /sum(count) as percent

from Table1
Group by name

デモを見る

編集。

または、あなたが望むのとまったく同じようにしたい場合は、これを試してください

 select name , sum(count) as total, CONCAT(sum(within_tat),' ' ,'(',sum(within_tat)*100 /sum(count),  '%',')' ) as percent

from Table1
Group by name

ここでデモをチェック

于 2013-01-23T18:11:42.183 に答える
0

この場合は an を使用しますIF(しゃれはさておき)。比較の複雑さを軽減しようとしましたが、実際のデータを確認せずに、それは最善の推測です.

   select 
   name, 
   count(name) as count, 
   concat(
      sum(if(datediff(minute, 
             (cast(RequestDate AS DATETIME) + 
              cast(RequestTime AS DATETIME)),
             REQUEST_TESTLINES.AuthDateTime) / 60 / 24 > EXP_TAT, 1, 0 )),
      ' (',
      format(
         (sum(if(datediff(minute, 
                 (cast(RequestDate AS DATETIME) + 
                  cast(RequestTime AS DATETIME)),
                 REQUEST_TESTLINES.AuthDateTime) / 60 / 24 > EXP_TAT, 1, 0 )        
            )/count(name))*100,1),
      '%)'
   ) as 'within tat'
于 2013-01-23T18:52:52.230 に答える