2009-08-20 10 views
3

1つのクエリで複数のカウントを返すSELECT文があります。1つのSQL SELECTクエリで複数のカウントにパーセンテージを追加

SELECT invalidCount = (SELECT COUNT(*) FROM <...a...> WHERE <...b...>), 
     unknownCount = (SELECT COUNT(*) FROM <...c...> WHERE <...d...>), 
     totalCount = (SELECT COUNT(*) FROM <...e...> WHERE <...f...>) 

これは正常に動作しますが、私が選択するために、2%の列を追加したい:

invalidCount * 100/totalCount AS PercentageInvalid, 
unknownCount * 100/totalCount AS UnknownPercentage 

どのように私はこれを処理するために私のSELECTステートメントを変更しますか?

あなたは from句でサブクエリを使用することができます

答えて

4

: - 非常に効率的にここで

select 
    s.invalidCount, 
    s.unknownCount, 
    s.totalCount, 
    invalidCount * 100/s.totalCount as PercentageInvalid, 
    unknownCount * 100/s.totalCount as PercentageUnknown 
from 
    (select invalidCount = (SELECT COUNT(*) FROM <...a...> WHERE <...b...>), 
     unknownCount = (SELECT COUNT(*) FROM <...c...> WHERE <...d...>), 
     totalCount  = (SELECT COUNT(*) FROM <...e...> WHERE <...f...>)) s 
0
SELECT invalidCount = (SELECT COUNT(*) FROM <...a...> WHERE <...b...>), 
     unknownCount = (SELECT COUNT(*) FROM <...c...> WHERE <...d...>), 
     totalCount  = (SELECT COUNT(*) FROM <...e...> WHERE <...f...>) 
INTO #tmp 

SELECT invalidCount, 
     unknownCount, 
     totalCount, 
     invalidCount * 100/totalCount AS PercentageInvalid, 
     unknownCount * 100/totalCount AS UnknownPercentage 
FROM #tmp 

DROP TABLE #tmp 
+0

を動作するはずがより速くあなたがそれは魔女が高速であることを確認していないが、あなた – user158017

+0

「(既存のクエリ)からinvalidCount * 100(など)を選択し、」ない場合よりも、このです常に両方のクエリーを書くことができますし、魔女がSQLプロファイラを使ってより速くなるのを見てください – IordanTanev

3
SELECT invalidCount, 
    unknownCount, 
    totalCount, 
    invalidCount * 100/totalCount AS PercentageInvalid, 
    unknownCount * 100/totalCount AS UnknownPercentage 
FROM 
    (
     SELECT invalidCount = (SELECT COUNT(*) FROM <...a...> WHERE <...b...>), 
     unknownCount = (SELECT COUNT(*) FROM <...c...> WHERE <...d...>),  
     totalCount  = (SELECT COUNT(*) FROM <...e...> WHERE <...f...>) 
    ) 
+0

CAST(floatとしてのtotalCount)を忘れないでください - そうでなければ整数除算を行っています... –

+2

これは動作しません。サブクエリ – Eric

1

は非常にクールですOVER句を使用して、異なるアプローチです。 AdventureWorksに対してこの例をチェックしてください:

SELECT DISTINCT CardType 
     ,COUNT(*) OVER (PARTITION BY CardType) AS TypeCount 
     ,COUNT(*) OVER (PARTITION BY 1) AS TotalCount 
     ,COUNT(*) OVER (PARTITION BY CardType)/CAST(COUNT(*) OVER (PARTITION BY 1) AS float) AS TypePercent 
FROM Sales.CreditCard 
1

私は間違いなくマイクのソリューションと一緒に行くでしょう!はるかにエレガントで効率的です。

しかし、ここではGROUP BYを使用しない理由はありません。それはそれをよりエレガントでより効率的にするでしょう。私は冗長な "COUNT(*)OVER(PARTITION BY 1)"を取り除き、代わりに数を合計することを提案します。

SELECT CardType 
     , COUNT(*) AS TypeCount 
     , SUM(COUNT(*)) OVER() AS TotalCount 
     , COUNT(*) * 1.0/SUM(COUNT(*)) OVER() AS TypePercent 
FROM Sales.CreditCard 
GROUP BY CardType 

  • "1 BY PARTITION" はそう省略し、冗長でした。
  • CardType-CountのSUMを集計すると、 を一度も分割せずに 私たちがテーブル全体を数えないように保存します。
  • 注釈の代わりに* 1.0が使用されます。
  • テストされていないクエリが、それは...
関連する問題