2014-01-15 42 views
1

我有得到一个问题串接值以下选择运行:GROUP BY与在选择列表

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填充这个变量的选择。需要手动构建它。

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

回答

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 
+0

构建临时表,然后在完成这个技巧之后再进行合并。谢谢! –

+0

太棒了!听到那个消息很开心。 –

0

尝试从GROUP BY条款移除串联如下:

GROUP BY Code_Type_Mode, Code_Complemen, Code_Phytocide 
+0

的直接修复以及消除DISTINCT使ORDER BY有效。 (DISTINCT无论如何都是多余的。) –