4

購入/返品/交換を含む販売テーブルがありますサンプル:

--------**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〜11/20/12の間に各顧客の合計を見つけます。その間に購入した商品をお客様が交換し、同日購入した場合はカウントされます。期待される結果は次のとおりです。

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]

助けてください!みんな、ありがとう。

4

2 に答える 2

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フィドルデモを確認する

于 2013-01-04T18:13:08.243 に答える
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
于 2013-01-04T19:39:49.307 に答える