2013-03-11 5 views
0

문제를 해결하는 데 도움주세요.이전 날짜를 포함한 상품 합계를 계산하는 방법

제대로 작동하지 못하는 경우 상점의 제품 수량을 확인하려면 판매 업체의 모든 제품의 합계를 판매 된 금액 인 에서 공제해야합니다. 전날의 차이와의 차이 - 재고가 남을 것입니다. 문제는 마지막 조건입니다.

지금까지 얻은 것 :
1 - 특정 날짜의 모든 공급 업체의 모든 제품 합계를 계산합니다.
Q2 - 특정 날짜에 판매 된 상품의 금액을 계산합니다. (지출)
Store_1 - 판매 된 제품의 금액은 모든 공급 업체의 모든 제품 합계에서 공제됩니다. (차이)
Store_2 - 전날의 차이 + 차이. 그러나이 수치는 첫 번째 줄을 제외하고 정확하게 계산되지 않습니다. (매장의 잔여 물)
올바른 데이터를 얻는 방법은 무엇입니까? 어디 조건 (특정 날짜 - 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 25,567 이전 날짜

(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 

입니다 (VARCHAR, DATEADD (S, nb.TEreport.data, 25567), 102)을 사용하려고하지만 오류 메시지가 : 때문에 잘못된 개체 이름 'Q1'잘못된 개체 이름 'Q2'

+0

것 같습니다. 예 : CONVERT (VARCHAR, DATEADD (s, nb.TEreport.data, 25568)? – booyaa

답변

0

Q1Q2 테이블을 유도하고 당신이 (당신의 (SELECT SUM (Q1.Goods - Q2.Goods)+330016 ...) 일이 바로 이것이다) 상관 하위 쿼리에서이를 참조 할 수 없습니다 사람들은 .

이 경우 쉽게 해결할 수있는 방법은 Q1Q2을 CTE로 다시 작성하는 것입니다. 그렇게하면 해당 하위 쿼리를 여러 번 참조 할 수있는 "로컬 뷰"로 작동합니다.

그래서, 여기 당신은 간다 : 당신이 1 분기 또는 2 분기 조인 중 하나에서 날엔에 대한 열 별칭을 정의하지 않은 것처럼

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

+0

* doesn ' 와일드 추측 : ';'으로 구분되지 않은 'WITH'앞에는 선언문이 있습니다. –

관련 문제