将值除以不同记录的sql查询
考虑以下记录集:将值除以不同记录的sql查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,考虑以下记录集: 1 1000 -1 2 500 2 3 1000 -1 4 500 3 5 500 2 6 1000 -1 7 500 1 因此,将数字1000乘以-1,总数为-3 用不同的值乘以数字500 现在我需要一个查询,将代码1000的总和除以4个数字500,然后删除代码1000。 因此,最终结果如下所示: 1 500 1.25 2 500 2.25 3 500 1.25 4 500 0.25 代码1000的总和=-3 表中有4次代码500,必须除
1 1000 -1
2 500 2
3 1000 -1
4 500 3
5 500 2
6 1000 -1
7 500 1
因此,将数字1000乘以-1,总数为-3
用不同的值乘以数字500
现在我需要一个查询,将代码1000的总和除以4个数字500,然后删除代码1000。
因此,最终结果如下所示:
1 500 1.25
2 500 2.25
3 500 1.25
4 500 0.25
代码1000的总和=-3
表中有4次代码500,必须除以-3。
-3/4=-0.75
因此记录“25002”变为“2500(2+-0.75)”=1.25
等
作为一名SQL新手,我不知道如何完成此任务,有人能帮忙吗?这将给出您想要的结果:
DECLARE @T TABLE (ID INT, Number INT, Value INT)
INSERT @T (ID, Number, Value)
VALUES
(1, 1000, -1),
(2, 500, 2),
(3, 1000, -1),
(4, 500, 3),
(5, 500, 2),
(6, 1000,-1),
(7, 500, 1);
SELECT Number, Value, NewValue = Value + (x.Total / COUNT(*) OVER())
FROM @T T
CROSS JOIN
( SELECT Total = CAST(SUM(Value) AS FLOAT)
FROM @T
WHERE Number = 1000
) x
WHERE T.Number = 500;
在交叉连接中,我们只需得到数字为1000的和,这与子选择一样简单:
SELECT Number, Value, NewValue = Value + ((SELECT CAST(SUM(Value) AS FLOAT) FROM @T WHERE Number = 1000) / COUNT(*) OVER())
FROM @T T
WHERE T.Number = 500;
或使用变量:
DECLARE @Total FLOAT = (SELECT SUM(Value) FROM @T WHERE Number = 1000);
SELECT Number, Value, NewValue = Value + (@Total / COUNT(*) OVER())
FROM @T T
WHERE T.Number = 500;
然后使用分析函数
COUNT(*)OVER()
可以计算出500个结果的总数。这将给出您想要的结果:
DECLARE @T TABLE (ID INT, Number INT, Value INT)
INSERT @T (ID, Number, Value)
VALUES
(1, 1000, -1),
(2, 500, 2),
(3, 1000, -1),
(4, 500, 3),
(5, 500, 2),
(6, 1000,-1),
(7, 500, 1);
SELECT Number, Value, NewValue = Value + (x.Total / COUNT(*) OVER())
FROM @T T
CROSS JOIN
( SELECT Total = CAST(SUM(Value) AS FLOAT)
FROM @T
WHERE Number = 1000
) x
WHERE T.Number = 500;
在交叉连接中,我们只需得到数字为1000的和,这与子选择一样简单:
SELECT Number, Value, NewValue = Value + ((SELECT CAST(SUM(Value) AS FLOAT) FROM @T WHERE Number = 1000) / COUNT(*) OVER())
FROM @T T
WHERE T.Number = 500;
或使用变量:
DECLARE @Total FLOAT = (SELECT SUM(Value) FROM @T WHERE Number = 1000);
SELECT Number, Value, NewValue = Value + (@Total / COUNT(*) OVER())
FROM @T T
WHERE T.Number = 500;
然后使用分析函数COUNT(*)OVER()
可以计算出500个结果的总数。您可以使用CTE“逐步”进行计算并构建解决方案。像这样:
with sumup as
(
select sum(colb) as s
from table
where cola = 1000
), countup as
(
select count(*) as c
from table
where cola = 500
), change as
(
select s / c as v
from sumup, countup
)
select cola, colb - v
from table, change
where cola = 500
有两点需要注意:
这可能不是最快的解决方案,但通常很接近
您可以轻松地测试这段代码,只需更改为final select语句来选择CTE的名称并查看它是什么。例如,如果您得到的结果不好,这将是一个很好的测试:
with sumup as
(
select sum(colb) as s
from table
where cola = 1000
), countup as
(
select count(*) as c
from table
where cola = 500
), change as
(
select s / c as v
from sumup, countup
)
select * form change
您可以使用CTE“逐步”完成这项工作,并构建您的解决方案。像这样:
with sumup as
(
select sum(colb) as s
from table
where cola = 1000
), countup as
(
select count(*) as c
from table
where cola = 500
), change as
(
select s / c as v
from sumup, countup
)
select cola, colb - v
from table, change
where cola = 500
有两点需要注意:
这可能不是最快的解决方案,但通常很接近
您可以轻松地测试这段代码,只需更改为final select语句来选择CTE的名称并查看它是什么。例如,如果您得到的结果不好,这将是一个很好的测试:
with sumup as
(
select sum(colb) as s
from table
where cola = 1000
), countup as
(
select count(*) as c
from table
where cola = 500
), change as
(
select s / c as v
from sumup, countup
)
select * form change
这里的tab、col1、col2是表名、具有(1000500)值的列、具有(1,2,3)值的列
这里的tab、col1、col2是表名、具有(1000500)值的列、具有(1,2,3)值的列,这里是另一种解决方案:
select number1, value1,
value1
+ (select sum(value1) from table1 where number1=1000)/
(select count(*) from table1 where number1=500) calc_value
from table1 where number1=500
我希望我没有弄错你的问题。这是最好的阅读方法。还有另一个解决方案:
select number1, value1,
value1
+ (select sum(value1) from table1 where number1=1000)/
(select count(*) from table1 where number1=500) calc_value
from table1 where number1=500
我希望我没有弄错你的问题。那么这就是最好的阅读方式。你能解释一下你是如何得到最终结果的吗?你到底需要什么数学运算?所以1000和500是需要这个运算的数字的关键?还是因为1000个是负数,500个是正数?你能解释一下你是如何得出最终结果的吗?你到底需要什么数学运算?所以1000和500是需要这个运算的数字的关键?还是因为1000个是负数,500个是正数?错误太多了。第二个子查询需要求和(col3)和计数。我选择这一个。它看起来最简单,但至少hogan应该得到更多的分数。“如果没有他的帮助,这一点是远远不正确的。”wumpz和我的答案实际上更具可读性。生活太不公平了!:-)@霍根;)我想不算,但这已经不算了。错误太多了。第二个子查询需要求和(col3)和计数。我选择这一个。它看起来最简单,但至少hogan应该得到更多的分数。“如果没有他的帮助,这一点是远远不正确的。”wumpz和我的答案实际上更具可读性。生活太不公平了!:-)@霍根;)我想不会,但这在这里已经不算了。