我有一张促销表,想要计算总额。
预期结果为482.33。
有些人(@rs)以前帮我查询过,但在这种情况下它不起作用。我希望在“2012/12/07”到“2012/12/09”之间获得该客户的总数减去任何返回(负面)项目,其中SKU与在此期间购买的项目相同日期范围。
结果出错了。能帮忙吗?
答案 0 :(得分: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]
这是this Fiddle。
这个查询非常简单地将你的答案和评论翻译成sql:
答案 1 :(得分: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;
答案 2 :(得分: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发生的日期范围之后的负面交易列表,并从那里获取总计。
注意:这已经写了很多麻烦。
如果在日期范围之前和日期范围内购买相同的sku会发生什么情况,那么之前的购买是否会被退回?这会将其从日期范围缩小。
你怎么知道实际返回的是什么?
为什么不从实际发生的时期减少回报?这是非常常见的,特别是如果返回发生一段时间后。
还有很多问题需要回答,但这只是给你一些思考的问题。