2013-03-11 76 views
0

请帮忙解决问题。如何计算商品总和包括以前的日期

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

我现在得到的结果:
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”

+0

它看起来像你没有在Q1或Q2连接定义逸列别名。假设这是:CONVERT(VARCHAR,DATEADD(s,nb.TEreport.data,25568)? – booyaa 2013-03-11 09:06:34

回答

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 
; 
+0

我使用MS SQL Server 2008 R2,但WITH在此处不起作用。问题是什么? – Jkterina 2013-03-12 08:43:05

+0

详细说明了* doesn'不用工作*位可能会有所帮助。疯狂的猜测:在'WITH'之前有一个不以';'分隔的语句。 – 2013-03-12 09:59:26

相关问题