0

请帮助解决问题。
我无法创建正确的工作请求,它可以计算两个查询之间的差异。
为了得到商店的商品数量,我们需要从所有供应商的所有产品的总和中减去销售的商品数量。

有两个单独的查询。

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 日期以秒为单位存储,这就是我使用日期转换器的原因。

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

假设您的两个查询都可以正常工作。这个想法是在第二次选择中反转货物值的符号,联合两个结果集,然后按 Dat 分组并计算货物的总和。

你可以在这个小提琴中看到一个简化的例子

于 2013-03-06T08:30:22.237 回答