2017-11-27 4 views
2

表1(顧客テーブル)に対処電話マックによって一意に識別SQLクエリ、不明、知られている顧客、

ID、CustomerIdの、IsKnownCustomer、phonemacaddress

1、NULL 0 00:9A:34:CF:A4

2、004024 1 00:6F:64:CF:A0:93

3、004024 1 00:6F:64:CF:A0:93

4,004003 1 2c:0e:3d:15:12: 43

6、NULL 0 2C:0E:3D:15:125

7、004003 1 34:F3:9A:EE:53:

8、004023 1 38 A9:0B:40 :DC:BA:66:41:11:26:0 4C NULL 3A

9、16

これはテーブルであり、データはすべての顧客、未知の顧客と知られている顧客のために必要とされます。

出力:phonemacaddressによってレコードを一意に見つけます。

countお客様、|顧客タイプ|
7すべて

3未知の顧客

4知ら顧客

+0

ようこそ、これは何のCodeProvidingプラットフォームではありません、あなたがして、あなたの最高動作しないattemtを提供する必要がありますコード、誰かがそれを修正することができます。 – Nikolaus

+0

ID#5がテーブルにありません。 – Zorkolot

答えて

4
あなたは労働組合を使用して数えることができる

select count(*), 'all' 
from customer 
union 
select count(*), 'unknown customer' 
from customer 
where isKnowCustomer = 0 
union 
select count(*), 'known customer' 
from customer 
where isKnowCustomer = 1 
+0

この結果、テーブルが3回スキャンされます。 'GROUP BY IsKnownCustomer WITH ROLLUP' *(またはそれと同等のもの)*にはスキャンが1回だけ必要です。また、UNIONが結果の重複を取り除くためのオーバーヘッドを避けるために、あなたの例のような場合には 'UNION ALL'を使用するべきです(実際には非常に強力で有用なパターンです)。 – MatBailie

1
私はちょうど1行でこれを置く

select count(*) as all, 
     sum(IsKnownCustomer) as known, 
     sum(1 - IsKnownCustomer) as unknown 
from t; 

なぜあなたが望むのか分かりません3つの列ではなく3つの行。

そうした場合、あなたは行うことができます:SQL以下

select (case when isKnownCustomer = 0 then 'Unknown' 
      when isKnownCustomer = 1 then 'Known' 
      else 'All' 
     end) as which, count(*) 
from t 
group by grouping sets ((IsKnownCustomer),()) 
+0

同じ結果ですが、なぜGROUP BY IsKnownCustomer WITH ROLLUP'を使用しないのですか? @MatBailie。 – MatBailie

+0

。 。 。 'grouping sets'はもっと一般的な構文なので、何かをする方法を思い出すのは簡単ですが、' rollupを使って 'も完全にうまくいきます。 –

1

をあなたを助けるでしょう。

SELECT 
    SUM(CASE WHEN Isknown = 1 THEN 1 ELSE 0 END) AS 'Known Customer', 
    SUM(CASE WHEN Isknown = 0 THEN 1 ELSE 0 END) AS 'Unknown Customer', 
    COUNT(*) AS 'All' 
FROM YourTable 
0

テーブルを1回のスキャンで集約し、次にUNPIVOTを使用できます。ここで

count customer customer type 
9    all 
3    unknown customer 
6    known customer 

SQLのフィドルで完全なコードです:

SELECT [count customer], [customer type] 
    FROM (--aggregations will be placed side-by-side 
     SELECT COUNT(*) [all] 
       ,COUNT(CASE WHEN IsKnownCustomer = 0 THEN 1 END) [unknown customer] 
       ,COUNT(CASE WHEN IsKnownCustomer = 1 THEN 1 END) [known customer] 
      FROM CustomerTable 
     ) AS dT 
UNPIVOT(--unpivot, will separate aggregations by row 
     [count customer] FOR [customer type] IN ([all], [unknown customer], [known customer]) 
     ) AS unp 

は出力が作成スタックオーバーフローにhttp://sqlfiddle.com/#!6/54e54/2/0

関連する問題