2017-09-25 14 views
0

SQL Serverでサブクエリを使用して2つのクエリの結果を得ようとしています。SQL Server - 2つのSQLクエリの結果を控除

私が達成しようとしているのは、「ProductX Promotion」の一部である顧客の数を計算し、「ProductX Promotion」の一部であり、過去60日間に実際にProductXを購入した顧客数を差し引くことです。これは、マーケティングのためのより良い洞察のためにProductXを購入していない登録済み顧客の数を私に与えます。

当初私はCOUNT()しか持っていなかったので、2つを引き算するのは簡単でした。現在の要件は、顧客の州および郵便番号によって細分化された数です。私は直接減算を使用することができないので、ここで問題が発生します。私は存在していないが動作しませんでした。私はJOINを試しましたが、まだ運がありません。私は解決策がかなりシンプルだが、私は考えることができないことを知っている。 はここでは、意味特定の何列に関するコメントと元のコードです

SELECT 
(SELECT COUNT (DISTINCT (c.CustomerNumber)) 
FROM Customer c 
INNER JOIN 
TransactionDetail t 
ON 
c.CustomerNumber = t.CustomerNumber 
WHERE c.ProductXPref = 1 --Indicates if Customer was part of ProductX promotion program. 
AND t.TransactionDate > DATEADD(d, -60, getdate())) 
- 
(SELECT COUNT (DISTINCT c.CustomerNumber) 
FROM Customer c 
INNER JOIN 
TransactionDetail t 
ON 
c.CustomerNumber = t.CustomerNumber 
WHERE t.ProductXIndicator = 1 --Indicates if ProductX was purchased 
AND t.TransactionDate > DATEADD(DD, -60, getdate()) 
AND c.ProductXPref = 1 --Indicates if Customer was part of ProductX promotion program. 
) AS 'Column Name' INTO #TempTable1 

ここで私が実装しようとしてんだよ、

SELECT 
(SELECT c.Zip, c.State, COUNT (DISTINCT (c.CustomerNumber)) 
FROM Customer c 
INNER JOIN 
TransactionDetail t 
ON 
c.CustomerNumber = t.CustomerNumber 
WHERE c.ProductXPref = 1 
AND t.TransactionDate > DATEADD(d, -60, getdate()) 
GROUP BY c.Zip, c.State) 
- 
(SELECT c.Zip, c.State, COUNT (DISTINCT c.CustomerNumber) 
FROM Customer c 
INNER JOIN 
TransactionDetail t 
ON 
c.CustomerNumber = t.CustomerNumber 
WHERE t.ProductXIndicator = 1 
AND t.TransactionDate > DATEADD(DD, -60, getdate()) 
AND c.ProductXPref = 1 
GROUP BY c.Zip, c.State) AS 'Column Name' INTO #TempTable1 

これは私が見誤りである、

メッセージ116、Level 16、State 1、Line 129 EXISTSでサブクエリが導入されていない場合、選択リストで指定できる式は1つだけです。

任意のポインタが役立ちます。ありがとう。

+0

私はそこから挿入することをお勧めします – maSTAShuFu

答えて

2

私はあなたがはるかに複雑、それは必要以上にこれを作っていると思います - あなただけのオリジナルにこれらの行が含まれていない場合は、あなたが見ることができるように最初のクエリが

SELECT COUNT(DISTINCT c.CustomerNumber) 
FROM Customer c 
INNER JOIN TransactionDetail t ON c.CustomerNumber = t.CustomerNumber 
WHERE 
    c.ProductXPref = 1 --Indicates if Customer was part of ProductX promotion program. 
AND t.TransactionDate > DATEADD(d, -60, getdate())) 
AND t.ProductXIndicator <> 1 

のように記述することができますそれは別のクエリを実行して減算することと同じです。

だから、第二は、これは動作するはず単に

SELECT c.Zip, c.State, COUNT(DISTINCT c.CustomerNumber) 
FROM Customer c 
INNER JOIN TransactionDetail t ON c.CustomerNumber = t.CustomerNumber 
WHERE 
    c.ProductXPref = 1 --Indicates if Customer was part of ProductX promotion program. 
AND t.TransactionDate > DATEADD(d, -60, getdate())) 
AND t.ProductXIndicator <> 1 
GROUP BY c.Zip, c.State 
+0

複数の列を1つの列から差し引く方法を教えてください。 – user2407394

+0

私は@ user2407394ではありません - 私はちょうど必要な選択 - 減算に列を含めません。 – Hogan

+0

Ohh ..そこに行ったことはありませんでした。 – user2407394

0

です:

SELECT 
    c.Zip, c.State,COUNT (DISTINCT c.CustomerNumber) 
FROM 
    Customer c 
     INNER JOIN TransactionDetail t 
      ON 
       c.CustomerNumber = t.CustomerNumber AND 
       c.ProductXPref = 1 --Indicates if Customer was part of ProductX promotion program. 
       AND t.TransactionDate > DATEADD(DD, -60, getdate()) 
WHERE t.ProductXIndicator <> 1 

GROUP BY c.Zip, c.State 
0

を数字が、私はそれらがあることを期待するものと一致しませんでしたいくつかの検証後に、それゆえ私は働いていた別のロジックを試してみました罰金と私の欲しいものを返しました。だから、ここに答えを掲示して、すべての助けをありがとう。

SELECT d.State, d.Zip, COUNT(DISTINCT(d.CustomerNumber)) AS 'Active Customers' 
    INTO #ProductDifference 
    FROM Customer c 
    INNER JOIN 
    TransactionDetail t 
    ON 
    c.CustomerNumber = t.CustomerNumber 
    WHERE d.ProductXPref = 1 
    AND t.TransactionDate > DATEADD(d, -60, getdate()) 
AND c.CustomerNumber 
NOT IN 
(SELECT DISTINCT d.[CustomerNumber] 
FROM Customer d 
    INNER JOIN 
    TransactionDetail f 
    ON 
    d.CustomerNumber = f.CustomerNumber 
WHERE f.ProductXIndicator = 1 
    AND f.TransactionDate > DATEADD(DD, -60, getdate()) 
    AND d.ProductXPref = 1) 
GROUP BY c.State, c.Zip 
関連する問題