0

問題の解決にご協力ください。
2 つのクエリの違いを計算できる適切な作業要求を作成できません。
ストア内の商品の数量を取得するには、すべてのサプライヤーからのすべての商品の合計から販売された商品の量を差し引く必要があります。

2 つの個別のクエリがあります。

1. まず、すべてのサプライヤーからのすべての製品の合計を計算します。

SELECT CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 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.dat, 25568), 102) <= CONVERT(VARCHAR, GETDATE(), 102))
AND CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102) >= '2013.01.01'
GROUP BY CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102)
ORDER BY Dat DESC

2. 次に、販売された商品の金額を計算します。

SELECT CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 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.dat, 25568), 102) <= CONVERT(VARCHAR, GETDATE(), 102))
AND CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102) >= '2013.01.01'
GROUP BY CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102)
ORDER BY Dat DESC

サブクエリを実行しようとしましたが、実際に必要なものではありません
。たとえば、

SELECT CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102) AS Dat,
  (SELECT SUM(nb.TEreport.weight)
   FROM nb.TEreport
   INNER JOIN nb.TEprovider ON nb.TEreport.id_provider = nb.TEprovider.id
   WHERE LEFT(nb.TEprovider.name, 10) != 'FROM STORE')-
  (SELECT SUM(nb.TEreport.weight)
   FROM nb.TEreport
   INNER JOIN nb.TEway ON nb.TEreport.id_way = nb.TEway.id
   WHERE SUBSTRING(nb.TEway.name, 5, 8) != 'TO STORE')
FROM nb.TEreport
WHERE CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102) <= CONVERT(VARCHAR, GETDATE(), 102)
  AND CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102) >= '2013.01.01'
GROUP BY CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102)
ORDER BY Dat ASC

ただし、この場合、クエリは特定の日の特定の金額を提供するのではなく、その期間のすべての数値の合計を提供するだけです。どうすれば問題を解決できますか?

PS Date は秒単位で保存されるため、 date converter を使用しました。

4

1 に答える 1

0

更新:試すことができます

 SELECT Dat, SUM(Goods) AS Goods
   FROM
(SELECT CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 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.dat, 25568), 102) <= CONVERT(VARCHAR, GETDATE(), 102))
    AND CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102) >= '2013.01.01'
  GROUP BY CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102)
  ORDER BY Dat DESC
  UNION ALL
 SELECT CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 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.dat, 25568), 102) <= CONVERT(VARCHAR, GETDATE(), 102))
    AND CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102) >= '2013.01.01'
  GROUP BY CONVERT(VARCHAR, DATEADD(s, nb.TEreport.dat, 25568), 102)
  ORDER BY Dat DESC) t
GROUP BY Dat
ORDER BY Dat DESC

両方のクエリが正常に機能すると仮定します。アイデアは、2 番目の選択で Goods 値の符号を反転し、2 つの結果セットを UNION してから、Dat でグループ化し、Goods の SUM を計算することです。

このフィドルで簡単な例を見ることができます

于 2013-03-06T08:30:22.237 に答える