Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将值除以不同记录的sql查询_Sql_Sql Server_Tsql - Fatal编程技术网

将值除以不同记录的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和我的答案实际上更具可读性。生活太不公平了!:-)@霍根;)我想不会,但这在这里已经不算了。