SQL查询总销售额

时间:2013-01-29 19:33:56

标签: sql sql-server

我有一张促销表,想要计算总额。

Here is the SQL Fiddle link

预期结果为482.33。

有些人(@rs)以前帮我查询过,但在这种情况下它不起作用。我希望在“2012/12/07”到“2012/12/09”之间获得该客户的总数减去任何返回(负面)项目,其中SKU与在此期间购买的项目相同日期范围。

结果出错了。能帮忙吗?

3 个答案:

答案 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:

  • 在特定时间段内的所有销售
  • 应包括此时间跨度后的负面销售
  • 但是负面销售应该至少有一个积极的同一个sku(在时间跨度内)
  • 应确定满足上述标准的所有销售价格的总和

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

SQL DEMO HERE

答案 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会发生什么情况,那么之前的购买是否会被退回?这会将其从日期范围缩小。

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

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

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