販売テーブルがあり、合計を計算したいと考えています。
予想される結果は 482.33 です。
誰か (@rs) が以前にクエリを手伝ってくれましたが、この場合はうまくいきません。'2012/12/07' から '2012/12/09' までのこの顧客の合計から、その期間中に購入された商品と同じ SKU を持つ返品 (マイナス)の商品を差し引いて取得したいと考えています。
結果は間違っていました。助けてください。
販売テーブルがあり、合計を計算したいと考えています。
予想される結果は 482.33 です。
誰か (@rs) が以前にクエリを手伝ってくれましたが、この場合はうまくいきません。'2012/12/07' から '2012/12/09' までのこの顧客の合計から、その期間中に購入された商品と同じ SKU を持つ返品 (マイナス)の商品を差し引いて取得したいと考えています。
結果は間違っていました。助けてください。
別のオプションを次に示します。
DECLARE @customer varchar(10) = '1111111111'
DECLARE @from date = '12/07/12'
DECLARE @till date = DATEADD(DAY, 2, @from)
DECLARE @exclusiveTill date = DATEADD(DAY, 1, @till)
-- added @exclusiveTill based on the comments
SELECT
[sub].[custid],
MAX([sub].[LatestDop]) AS [dateid],
SUM([sub].[PriceSum]) AS [price]
FROM
(
SELECT
[custid],
MAX([dop]) AS [LatestDop],
[sku],
SUM([price]) AS [PriceSum],
SUM(CASE WHEN [price] >= 0 THEN 1 ELSE 0 END) AS [numberOfPositives]
FROM [sale]
WHERE
[custid] = @customer
AND [dop] >= @from
AND (CASE WHEN [price] < 0 THEN @till ELSE [dop] END) < @exclusiveTill
GROUP BY
[custid],
[sku]
) AS [sub]
WHERE
[sub].[numberOfPositives] > 0
GROUP BY
[sub].[custid]
これはこの Fiddleで作成されました。
このクエリは、回答とコメントを文字通り SQL に変換しています。
これを試して
;WITH T AS
(
SELECT * FROM sale WHERE Price > 0
AND [dop] BETWEEN '12/07/12' AND '12/09/12'
UNION
SELECT A.* FROM sale a WHERE price < 0
AND EXISTS (SELECT SKU FROM sale x
WHERE x.Price > 0 AND a.sku = x.sku
AND a.custid = x.custid
AND x.[dop] BETWEEN '12/07/12' AND '12/09/12')
)
SELECT Custid, max(dop) dateid, sum(price) Price
FROM T
GROUP BY custid;
新しい情報でこれを試してください:
DECLARE @datemin date = '12/7/12',
@datemax date = '12/9/12',
@custid varchar(10)='1111111111'
;WITH RECS AS(
SELECT custid,dop,sku,Price
FROM sale
WHERE dop BETWEEN @datemin AND @datemax AND custid=@custid AND price>=0)
SELECT custid,MAX(dop)dateid,SUM(price)price
FROM(
SELECT custid,dop,price FROM RECS
UNION ALL
SELECT custid,dop,price FROM sale
WHERE sku IN (SELECT sku FROM RECS) AND price < 0 AND dop > @datemax)t
GROUP BY custid
きれいではありませんが、まったく異なるアプローチを示しており、すばやくまとめることができました。
日付範囲内のトランザクションのリストと、日付範囲内で SKU が発生した日付範囲以降の負のトランザクションのリストを作成し、そこから合計を取得します。
注意: これには TROUBLE があちこちに書かれています。
同じ SKU が日付範囲より前に購入され、かつ日付範囲内に購入され、以前の購入が返品された場合はどうなりますか? これにより、日付範囲が縮小されます。
実際に返されたものをどのように知ることができますか?
それが実際に起こった期間からリターンを減分しないのはなぜですか? これは非常によくあることで、特に復帰がしばらくしてから発生した場合に顕著です。
答えなければならない質問は他にもたくさんありますが、それはあなたに考えさせる何かを与えるだけです.