繁体   English   中英

如何在select语句中执行多个聚合列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM