请帮助解决问题。
我无法创建正确的工作请求,这可以计算两个查询之间的差异。
为了获得商店中的商品数量,我们需要从所有供应商的所有产品的总和中扣除销售的商品数量。
有两个单独的查询。
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。日期以秒为单位存储,这就是我使用日期转换器的原因。
答案 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
中查看简化示例