GROUP BY在选择列表中具有连接值

时间:2014-01-15 22:05:41

标签: sql sql-server tsql sql-server-2000

我在运行以下SELECT时遇到问题:

SET @final = '<CoutUnitaire>'

SELECT  DISTINCT
    @final = COALESCE(@final +  '', ',') + 
    '<row><Intervention>' + Code_Type_Mode + ' ' + Code_Complement + ' ' + Code_Phytocide + '</Intervention>' + 
    '<cout_moyen>' + CAST(CAST(AVG(Travail.cout_par_ha) AS DECIMAL(10,2)) AS VARCHAR) + '</cout_moyen>' +
    '</row>' 
FROM Travail 
    INNER JOIN Budget ON Travail.ID_Budget = Budget.ID_Budget 
    INNER JOIN Territoire ON Budget.ID_Territoire = Territoire.ID_Territoire 
    INNER JOIN Complement ON Travail.ID_Complement = Complement.ID_Complement 
    INNER JOIN Phytocide ON Travail.ID_Phytocide = Phytocide.ID_Phytocide 
    INNER JOIN Type_Mode ON Travail.ID_Type_Mode = Type_Mode.ID_Type_Mode 
    INNER JOIN #Years ON Budget.Annee_Budgetaire = #Years.intYear
WHERE dbo.Budget.ID_Territoire IN (SELECT intTerritoryID FROM #Territories) AND (@circref = 0 OR circref = @circref)
GROUP BY Code_Type_Mode + ' ' + Code_Complement + ' ' + Code_Phytocide
ORDER BY Code_Type_Mode + ' ' + Code_Complement + ' ' + Code_Phytocide

SET @final = @final + '</CoutUnitaire>'

它返回:

列'Type_Mode.Code_Type_Mode'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

列'Complement.Code_Complement'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

列'Phytocide.Code_Phytocide'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。


限制:

运行SQL Server 2000,所以我没有选择使用FOR XML填充此变量。需要手动构建它。

如何以正确的顺序获取这些行,同时仍然将它们连接成一个字符串?

2 个答案:

答案 0 :(得分:0)

尝试从GROUP BY子句中删除串联,如下所示:

GROUP BY Code_Type_Mode, Code_Complemen, Code_Phytocide

答案 1 :(得分:0)

当我玩这个时,我发现你可以通过将整个选择字符串放在Group By中来使其工作。
我不确定这是最好的方法,但下面的简化案例显示了它。

我想知道你是否可以通过将xml输出与COALESCE与其余部分分开来获得更好的性能和维护。

你可以进行连接并将Avg()和3个字符串字段拉入临时表,然后执行COALESCE技巧来构建输出字符串吗?


....显示此案例的直接修复

/*
drop table a
drop table b
drop table c
*/    

create table a (
    id int
    ,dataKey int
)
;

create table b (
    dataKey int
    ,dataVal varchar(100)
)
;

create table c (
    dataKey int
    ,dataVal varchar(100)
)
;

-----
insert into a
(id, dataKey)
values
(1, 1)
;
insert into a
(id, dataKey)
values
(2, 2)
;

-----
insert into b
(dataKey, dataVal)
values
(1, 'asdf')
;
insert into c
(dataKey, dataVal)
values
(1, 'jkl;')
;



declare @final varchar(1000);
set @final = 'start....';

select
    @final = 
        coalesce(@final + ',', ',')
        + 
        b.dataval
        + ' ' 
        + c.dataval
from
    a
        inner join b on a.dataKey = b.dataKey
        inner join c on a.dataKey = c.dataKey
group by
        coalesce(@final + ',', ',')
        + 
        b.dataval
        + ' ' 
        + c.dataval

print @final