我有一张销售表,想计算总数。
预期结果为 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 的日期范围之后的负面交易列表,并从那里获取您的总数。
注意:这上面写满了麻烦。
如果在日期范围之前并且在日期范围内购买了相同的 sku,那么之前的购买被退回,会发生什么情况?这将从日期范围减少它。
你怎么知道哪个是实际返回的?
为什么不从实际发生的时期减少回报呢?这很常见,特别是如果返回发生在一段时间后。
还有很多问题需要回答,但这只是给你一些思考的东西。