![](/img/trans.png)
[英]SQL Server - How to have non-aggregated columns in Select statement when using group by?
[英]How to do multiple aggregated columns in a select statement
只是为了避开快速回答者,我会提到我没有使用MySQL,所以不能使用GROUP_CONCAT,并且我已经研究了这个问题 。
这个例子
(这不是我正在使用的数据,但它准确地描述了我的情况)
人员表,带有ID,名称列
Person_CountriesVisited表,带有PersonID,“国家”列(1..M链接表)
Person_StatesVisited表,带有PersonID,状态列(1..M链接表)
约束条件
我无法修改数据库。 我也不能修改很多代码,因此必须在SQL中完成,而不是在运行查询后在代码中完成。
理想的结果
具有列的结果集
人ID
人名,
[相关的Person_CountriesVisited.Country列表],
[相关的Person_StatesVisited.State列表],
也可以通过适用于所有列的通用搜索字词进行过滤。
我的尝试
现在,我的SQL-fu现在并不那么精明,但是我正在根据发现的示例来做我能做的事情。
1)我尝试使用标量子查询:
选择P.ID,P。名称,
(选择CV.Country +','
FROM Person_Countries访问的CV ON P.ID = CV.PersonId
FOR XML PATH(''))AS国家
(SELECT SV.State +','
FROM Person_States访问的SV ON P.ID = SV.PersonId
FOR XML PATH(''))AS状态
从人P
其中的名称类似'%'+ @SearchTerm +'%'
或国家/地区访问喜欢的'%'+ @SearchTerm +'%'
或州像'%'+ @SearchTerm +'%'
它返回我想要的数据,但是仅当我删除WHERE子句时才返回。 它不适用于WHERE子句,因为SQL Server 2005似乎不喜欢我在WHERE子句中引用从标量子查询创建的列。 这给了我一个“无效的列名'CountriesVisited'”错误(对于StatesVisited列也是如此)。
2)我尝试了交叉应用技巧:
选择P.ID,P。名称,国家访问,国家访问
从人P
INNER JOIN Person_Countries访问的CV ON P.ID = CV.PersonID
交叉应用(
SELECT CV.Country +','
FROM人员P2内部联接Person_Countries在P2.ID = CV.PersonID上访问的简历
P.ID = P2.ID
FOR XML路径('')
)PRE_TRIMMED(访问国家)
内连接Person_States访问的SV ON P.ID = SV.PersonID
交叉应用(
SELECT SV.State +','
FROM Person P2内连接Person_States访问的SV ON P2.ID = SV.PersonID FOR XML PATH('')
)PRE_TRIMMED(状态已访问)
其中的名称类似'%'+ @SearchTerm +'%'
或国家/地区访问喜欢的'%'+ @SearchTerm +'%'
或州像'%'+ @SearchTerm +'%'
但这也不起作用,因为您显然无法进行多个pre_trimmed调用。
有人对我有建议吗?
您只需要别名子查询:
WITH x AS (
SELECT P.ID
,P.Name
,( select CV.Country + ', '
FROM Person_CountriesVisited CV ON P.ID = CV.PersonId
FOR XML PATH ('')
) AS CountriesVisited
,( SELECT SV.State + ', '
FROM Person_StatesVisited SV ON P.ID = SV.PersonId
FOR XML PATH ('')
) AS StatesVisited
FROM Person P
)
SELECT *
FROM X
WHERE Name LIKE '%' + @SearchTerm + '%'
OR CountriesVisited LIKE '%' + @SearchTerm + '%'
OR StatesVisted LIKE '%' + @SearchTerm + '%'
您可以在第二个示例中执行类似的操作。 实际上,在第二个示例中,只需将第二PRE_TRIMMED2
查询作为新别名(例如PRE_TRIMMED2
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.