Sql 不仅仅是另一个“选择列表中的列无效”错误
我这样说是因为我尝试了所有常用的解决方案,但它们都不起作用。这是我的 表1 这是通过使用3个SELECT与一个联合在一起的组成功填充的 表2 我所要做的就是从表1填充此表,同时添加我使用以下stmt计算的百分比列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,
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