2017-09-25 250 views
0

我想在SQL Server中使用子查詢的兩個查詢的結果。SQL Server - 減去兩個SQL查詢的結果

我想要實現的是計算屬於「ProductX Promotion」一部分的客戶數量,並減去屬於「ProductX Promotion」的客戶數量,並在過去60天內實際購買了ProductX。這給了我沒有購買ProductX的註冊客戶的數量,以獲得更好的營銷洞察力。

最初我只有COUNT(),因此很容易將這兩個數相減。現在需求是按客戶的狀態和Zip級別細分計數。問題出現在這裏,因爲我不能使用直接減法,我嘗試不存在,但沒有工作,我嘗試了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,級別16,狀態1,行129 子查詢未與EXISTS一起引入時,只能在選擇列表中指定一個表達式。

任何指針都會有所幫助。謝謝。

+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

如何從一列中減去多列? – user2407394

+0

我不@ @ user2407394 - 我只是不包括在選擇列 - 不需要減法。 – Hogan

+0

哦..沒有看到你在那裏做了什麼.. – 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