2013-01-04 249 views
4

我有一個銷售表包括購買/返回/交流 樣品:SQL銷售總額計算

--------**saleTbl**------------ 
CustID | DOP | SKU | Price 
111 | 11/05/12 | 001 | 45.99 
222 | 11/20/12 | 001 | 45.99 
111 | 11/06/12 | 002 | 40.95 
111 | 11/06/12 | 001 | -45.99 
111 | 11/19/12 | 004 | 50.00 
222 | 11/25/12 | 003 | 20.99 
111 | 12/01/12 | 002 | -40.95 
111 | 12/01/12 | 003 | 20.99 

標準是:在11/05/12爲每個客戶找到總 - 12年11月20日。如果客戶交換了在此期間購買的物品,並且在同一天購買的物品將被計數。 預期的結果是:

CustID | DOP | Price 
222 | 11/20/12 | 45.99 
111 | 12/01/12 | 70.99 

我試圖獲得總但當然這是不對的:

SELECT DISTINCT [num_cp] AS 'Member Id' 
     ,MAX([dop]) AS 'Date' 
     ,SUM([price]) AS 'Point' 
    FROM [Mailing_List].[dbo].[UGG_DoublePoint] 
    WHERE [num_cp] IN 
    (
    SELECT [num_cp] 
    FROM [Mailing_List].[dbo].[UGG_DoublePoint] 
    GROUP BY [num_cp] 
    HAVING SUM([price]) >0 
) 
    --AND 
    AND [dop] BETWEEN '11/05/12' AND '11/20/12' 
    GROUP BY [num_cp] 

請幫幫忙!感謝大家。

+2

你使用的是什麼rdbms? – Taryn

+0

它是SQL 2008. – tkvo

+0

如果期間在11/05/12 - 11/20/12之間,爲什麼在您的預期結果是12/01/12條目列出?你能詳細說明還是修復預期的輸出結果? –

回答

1

我想你需要查詢更改這個

; WITH CTE AS 
(
    SELECT *, 
    COUNT(*) OVER (PARTITION BY CustID, DOP) Row_Cnt 
    FROM TEST 
), CTE2 AS 
(
    SELECT * FROM CTE 
    WHERE [dop] BETWEEN '11/05/12' AND '11/20/12' 
), CTE3 AS 
(
    SELECT * FROM CTE2 WHERE price > 0 
    UNION 
    SELECT * FROM CTE2 WHERE price < 0 
    and SKU IN (SELECT SKU FROM CTE2 WHERE Price > 0) 
    UNION 
    SELECT * FROM CTE 
    WHERE row_cnt > 1 and DOP IN (
    SELECT max(A.dop) d FROM CTE A 
    INNER JOIN CTE2 B ON A.CustID = B.CustID AND A.SKU = B.SKU 
    ) 
) 
SELECT Custid, max(dop) dateid, sum(price) Price 
from cte3 
group by custid; 

檢查SQL Fiddle Demo

+0

@tkvo試試這個 - http://sqlfiddle.com/#!3/7cee5/10 –

+0

非常感謝你 – tkvo

+0

你能否再次用相同的查詢來幫助我,但不需要再計算交換項目,只需減去任何回報即可。這裏是SQL Fiddle鏈接:http://sqlfiddle.com/#!3/f3c03/1。預期的結果是Total = 482.33 – tkvo

0

我認爲這會工作。它基本上通過使用左連接過濾掉結果集中的任何返回。

注意:如果某人在同一天購買/退回了同一件物品的多個SKU,則會出現問題。

select pur.CustId, sum(pur.price) TotalPrice 
from test pur 
left join test ret 
    on pur.custid = ret.custid 
    and pur.dop = ret.dop 
    and pur.sku = ret.sku 
    and pur.price = (-1 * ret.price) 
where pur.dop between '11/05/2012' AND '11/20/2012' 
    and ret.price is null 
group by pur.CustId