在MS SQL中减去两个查询

时间:2013-03-06 08:05:57

标签: sql-server sql-server-2008

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

有两个单独的查询。

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

但在这种情况下,查询没有给出特定日期的具体金额,它只给出了该期间所有数字的总和。 我该如何解决这个问题呢?

P.S。日期以秒为单位存储,这就是我使用日期转换器的原因。

1 个答案:

答案 0 :(得分: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

假设您的查询都正常。我们的想法是在第二个选择,UNION两个结果集中反转Goods值的符号,然后按Dat分组并计算商品的总和。

您可以在此 fiddle

中查看简化示例