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 的正面(在时间跨度内)
  • 并且应确定满足上述条件的所有销售价格的总和
于 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 的日期范围之后的负面交易列表,并从那里获取您的总数。

注意:这上面写满了麻烦。

如果在日期范围之前并且在日期范围内购买了相同的 sku,那么之前的购买被退回,会发生什么情况?这将从日期范围减少它。

你怎么知道哪个是实际返回的?

为什么不从实际发生的时期减少回报呢?这很常见,特别是如果返回发生在一段时间后。

还有很多问题需要回答,但这只是给你一些思考的东西。

于 2013-01-29T19:43:32.467 回答