不仅仅是另一个“选择列表中的列无效”错误
Posted
技术标签:
【中文标题】不仅仅是另一个“选择列表中的列无效”错误【英文标题】:not just another 'column invalid in select list' error 【发布时间】:2014-11-26 13:24:31 【问题描述】:我这样说是因为我尝试了所有常用的解决方案,但它们都不起作用。这就是我所拥有的..
表 1
CREATE TABLE dbo.Temp
(
PrintData nvarchar(250) NOT NULL,
Acronym nvarchar(3) NOT NULL,
Total int not null
)
这是使用 3 个 SELECT 和 Group By 联合在一起成功填充的
表 2
CREATE TABLE dbo.Result
(
PrintData nvarchar(250) NOT NULL,
Acronym nvarchar(3) NOT NULL,
Total int not null,
[Percent] decimal(7,5) not null
)
我要做的就是从表 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
但是 Percent col 在每一行显示为 0.00000 我认为这可能与 group by 有关,但如果我删除它,我会得到我引用的那个愚蠢的错误。 表 1 中的一些示例数据..
OSHIKANGO OSH 1
WINDHOEK 1 WHA 18
WINDHOEK 2 WHB 8
WINDHOEK 3 WHC 2
WINDHOEK 4 WHD 4
使用此示例数据,SUM(Total) 为 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
似乎它应该比这更简单,希望我不必使用事务/游标循环..
【问题讨论】:
将 [Percent] 列的数据类型更改为小数(7,4)或小数(8,5)。如果计算出的 [Percent] 值为 100,那么您将得到“Airthmetic 溢出错误”。 我建议不要存储这个计算值。当行被删除或更新时会发生什么?这就是我们不存储计算值而是在运行时执行此操作的原因。如果它不使用聚合,我建议使用计算列。 【参考方案1】:尝试修改您的查询,如下所示,分别计算百分比并稍后使用JOIN
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;
【讨论】:
由于 t.Total 和 SUM(t.Total) 都是整数,难道你还不会遇到整数除法问题吗? @AnthonyGrist,是的,没有注意到这一点。谢谢。【参考方案2】:有转换问题,试试这个查询:
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
我还看到你也是Total
的组。在这种情况下,您可以使用它:
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
【讨论】:
【参考方案3】:将两者都转换为十进制 (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
【讨论】:
以上是关于不仅仅是另一个“选择列表中的列无效”错误的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL 中使用 Group By 和 Aggregate - 获取错误“选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 中”
选择列表中的列……无效,因为该列没有包含在聚合函数或 GROUP BY 子句中
选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中