0

問題の解決にご協力ください。

正常に機能するように要求できません。ストア内の商品の数量を取得するために、販売した商品の量からすべてのサプライヤーからのすべての製品の合計を差し引き、差額を差額に加算する必要があります。前日~残り在庫となります。問題は最後の条件にあります..

私が今持っているもの:
Q1 - 特定の日付のすべてのサプライヤーからのすべての製品の合計を計算します。(収入)
Q2 - 特定の日付に販売された商品の量を計算します。(spending)
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'

4

1 に答える 1

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
;
于 2013-03-11T17:34:08.977 に答える