1

販売テーブルがあり、合計を計算したいと考えています。

ここに SQL Fiddle リンクがあります

予想される結果は 482.33 です。

誰か (@rs) が以前にクエリを手伝ってくれましたが、この場合はうまくいきません。'2012/12/07' から '2012/12/09' までのこの顧客の合計から、その期間中に購入された商品と同じ SKU を持つ返品 (マイナス)の商品を差し引いて取得したいと考えています。

結果は間違っていました。助けてください。

4

3 に答える 3

2

別のオプションを次に示します。

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 に変換しています。

  • 特定の期間内のすべての売上
  • この期間以降のマイナスの売上を含める必要がある場合
  • ただし、マイナスの販売には、同じ SKU で少なくとも 1 つのプラスが必要です (期間内)。
  • そして、上記の基準を満たす販売のすべての価格の合計を決定する必要があります
于 2013-01-29T20:52:44.270 に答える
1

これを試して

;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;

SQLデモはこちら

于 2013-01-29T19:58:01.683 に答える
0

新しい情報でこれを試してください:

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 が日付範囲より前に購入され、かつ日付範囲内に購入され、以前の購入が返品された場合はどうなりますか? これにより、日付範囲が縮小されます。

実際に返されたものをどのように知ることができますか?

それが実際に起こった期間からリターンを減分しないのはなぜですか? これは非常によくあることで、特に復帰がしばらくしてから発生した場合に顕著です。

答えなければならない質問は他にもたくさんありますが、それはあなたに考えさせる何かを与えるだけです.

于 2013-01-29T19:43:32.467 に答える