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

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 子句中

SQL:选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 子句中[关闭]

选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中