Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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_Select - Fatal编程技术网

Sql 不仅仅是另一个“选择列表中的列无效”错误

Sql 不仅仅是另一个“选择列表中的列无效”错误,sql,sql-server,select,Sql,Sql Server,Select,我这样说是因为我尝试了所有常用的解决方案,但它们都不起作用。这是我的 表1 这是通过使用3个SELECT与一个联合在一起的组成功填充的 表2 我所要做的就是从表1填充此表,同时添加我使用以下stmt计算的百分比列 INSERT INTO dbo.Result (PrintData, Acronym, Total, [Percent]) select *, ((t.Total / SUM(t.Total)) * 100) from Temp t group by PrintData,

我这样说是因为我尝试了所有常用的解决方案,但它们都不起作用。这是我的

表1

这是通过使用3个SELECT与一个联合在一起的组成功填充的

表2

我所要做的就是从表1填充此表,同时添加我使用以下stmt计算的百分比列

INSERT INTO dbo.Result
    (PrintData, Acronym, Total, [Percent]) 
select *, ((t.Total / SUM(t.Total)) * 100) 
from Temp t 
group by PrintData, Acronym, Total
但每行的col百分比为0.00000 我认为这可能与小组有关,但如果我删除它,我就会犯我引用的愚蠢错误。 表1中的一些示例数据

OSHIKANGO   OSH 1
WINDHOEK 1  WHA 18
WINDHOEK 2  WHB 8
WINDHOEK 3  WHC 2
WINDHOEK 4  WHD 4
根据该样本数据,SUMTotal为33。表2中我想要的是

OSHIKANGO   OSH 1     3.03030
WINDHOEK 1  WHA 18    54.5454
WINDHOEK 2  WHB 8     24.2424
WINDHOEK 3  WHC 2     etc
WINDHOEK 4  WHD 4

看起来应该比这更简单,希望我不必使用事务/光标循环。

尝试像下面这样修改您的查询,分别获取百分比计算,然后与它进行联接

INSERT INTO dbo.Result (PrintData, Acronym, Total, [Percent]) 
select t1.PrintData, 
t1.Acronym, 
t1.Total, 
tab.computed
from Temp t1
join
(
select PrintData, 
cast(t.Total as decimal(7,5)) / SUM(t.Total) * 100  as computed 
from Temp t 
group by PrintData, Total 
) tab on t1.PrintData = tab.PrintData;

出现铸造问题,请尝试此查询:

INSERT INTO dbo.Result
SELECT PrintData,
       Acronym,
       Sum(Total) [total],
       Round(Sum(Total) / Cast((SELECT Sum(Total)
                                FROM   temp) AS DECIMAL(10, 4)) * 100, 4) [Percent]
FROM   temp
GROUP  BY PrintData,Acronym 
我还看到你们也是按总数分组的。在这种情况下,您可以使用:

INSERT INTO dbo.Result
SELECT *,Round((Sum(Total)OVER(partition BY PrintData, Acronym)) / Cast(Sum(Total) OVER() AS DECIMAL(10, 4)) * 100, 4) AS [percent]
FROM   temp

将两者转换为十进制7,5

INSERT INTO dbo.Result
    (PrintData, Acronym, Total, [Percent]) 
select *, (convert(decimal(7,5),Total) / 
(select SUM(convert(decimal(7,5),Total)) * 100  AS [percent]   FROM temp))
from Temp 
group by PrintData, Acronym, Total

既然t.Total和SUMt.Total都是整数,你不会还会遇到整数除法问题吗?@AnthonyGrist,是的,没有注意到这一点。谢谢。将[Percent]列的数据类型更改为小数7,4或小数8,5。如果计算的[Percent]值为100,则会出现“Airthmetic overflow error”。建议不要存储此计算值。删除或更新行时会发生什么情况?这就是为什么我们不存储计算值,而是在运行时存储。如果它不使用聚合,我建议使用计算列。
INSERT INTO dbo.Result
SELECT *,Round((Sum(Total)OVER(partition BY PrintData, Acronym)) / Cast(Sum(Total) OVER() AS DECIMAL(10, 4)) * 100, 4) AS [percent]
FROM   temp
INSERT INTO dbo.Result
    (PrintData, Acronym, Total, [Percent]) 
select *, (convert(decimal(7,5),Total) / 
(select SUM(convert(decimal(7,5),Total)) * 100  AS [percent]   FROM temp))
from Temp 
group by PrintData, Acronym, Total