如何计算包括前一日期在内的货物总和

时间:2013-03-11 08:47:53

标签: sql-server sql-server-2008

请帮助解决问题。

无法使请求正常工作, 为了获得商店中的商品数量,我需要从销售商品的数量中扣除所有供应商的所有产品的总和, 然后将差异添加到前一天的差异 - 它将是库存的剩余部分。问题出在最后一个条件上。

我现在得到了什么:
Q1 - 计算特定日期所有供应商的所有产品的总和。 (收入)
Q2 - 计算特定日期的商品销售量。 (支出)
Store_1 - 销售的商品数量从所有供应商的所有产品的总和中扣除。 (差)
Store_2 - 前一天的差异+差异。但除第一行外,这些数字计算不正确。 (店内剩余部分)
如何获得正确的数据? WHERE条件(特定日期 - 1天?)

日期以秒为单位存储,这就是我使用日期转换器的原因。

SELECT Q1.Dat, Q1.Goods AS Q1, Q2.Goods AS Q2, Q1.Goods - Q2.Goods  AS Store_1,
(CASE WHEN Q1.Dat <= '2013.01.01' THEN Q1.Goods - Q2.Goods + 330016
ELSE (Q1.Goods - Q2.Goods) + (SELECT SUM (Q1.Goods - Q2.Goods)+330016 FROM Q1, Q2
WHERE particular date – 1 day) END ) AS Store_2

FROM
    (SELECT TOP 100 PERCENT CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) AS Dat, 
    SUM(nb.TEreport.goods) AS Goods
    FROM nb.TEreport INNER JOIN nb.TEprovider ON nb.TEreport.id_provider = nb.TEprovider.id
    WHERE (LEFT(nb.TEprovider.name, 10) != 'FROM STORE') 
    AND (CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) <= CONVERT(VARCHAR, GETDATE(), 102))
    AND CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) >= '2013.01.01'
    GROUP BY CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102)
    ORDER BY Dat ) Q1 --income
INNER JOIN
    (SELECT TOP 100 PERCENT CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) AS Dat, 
    SUM(nb.TEreport.goods) AS Goods
    FROM nb.TEreport INNER JOIN nb.TEway ON nb.TEreport.id_way = nb.TEway.id
    WHERE (SUBSTRING(nb.TEway.name, 5, 8) != 'TO STORE') 
    AND (CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) <= CONVERT(VARCHAR, GETDATE(), 102))
    AND CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102) >= '2013.01.01'
    GROUP BY CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25568), 102)
    ORDER BY Dat ) Q2 --spending
ON Q1.Dat = Q2.Dat
ORDER BY Q1.Dat

尝试使用 CONVERT(VARCHAR,DATEADD(s,nb.TEreport.data,25567),102),其中25567是前一个日期

 (CASE WHEN Q1.Dat <= '2013.01.01' THEN Q1.Goods - Q2.Goods + 330016
    ELSE (Q1.Goods - Q2.Goods) + (SELECT SUM (Q1.Goods - Q2.Goods)+330016 FROM Q1, Q2
    WHERE CONVERT(VARCHAR, DATEADD(s, nb.TEreport.data, 25567), 102) ) END ) AS Store_2

但是我有一条错误消息:无效的对象名称'Q1',无效的对象名称'Q2'

1 个答案:

答案 0 :(得分:0)

Q1Q2是派生表,您无法从相关子查询中引用它们(这是(SELECT SUM (Q1.Goods - Q2.Goods)+330016 ...)的内容),因为它们是。

在这种情况下,一个简单的解决方案是将Q1Q2重写为CTE。这样他们就可以充当“本地视图”,这将允许您多次引用这些子查询。

所以,你走了:

WITH Q1 AS (
  SELECT ...      -- your Q1 subquery
),
Q2 AS (
  SELECT ...      -- your Q2 subquery
)
SELECT ...        -- same as before but Q1 and Q2 are now valid
                  -- for referencing in other subqueries

FROM Q1           -- just "Q1" and "Q2" instead of the subqueries
INNER JOIN Q2

ON ...            -- the rest of your query as before
;