Sql server 2008 更改单元格的值,然后连接成一行SQL Server 2008
所以我试图同时做几件事,但我不知道如何把它们组合起来 我的第一步是根据id将多个单元格合并成一行Sql server 2008 更改单元格的值,然后连接成一行SQL Server 2008,sql-server-2008,tsql,case,for-xml-path,Sql Server 2008,Tsql,Case,For Xml Path,所以我试图同时做几件事,但我不知道如何把它们组合起来 我的第一步是根据id将多个单元格合并成一行 USE MAIN; Select ACT.ID AS Activity ,STUFF (( Select ',' + LE.Name AS [text()] FROM ActivityDemographicEthnicity ADE LEFT OUTER JOIN LookupEthnicity LE
USE MAIN;
Select ACT.ID AS Activity
,STUFF (( Select ',' + LE.Name AS [text()]
FROM ActivityDemographicEthnicity ADE
LEFT OUTER JOIN LookupEthnicity LE
ON LE.ID = ADE.ethinicityId
WHERE ACT.ID = ADE.ActivityID
FOR XML PATH ('')),1,1,'')
AS Ethnicity
FROM Activity ACT
这很有效,并产生如下结果:
ID Ethnicity
------------------------------------------
123 African, African American, Caucasian
125 Caucasian
128 NULL
ID Ethnicity
----------------------------------------
123 African American, Caucasian
125 Caucasian
128 General Market
但我想要这样的东西:
ID Ethnicity
------------------------------------------
123 African, African American, Caucasian
125 Caucasian
128 NULL
ID Ethnicity
----------------------------------------
123 African American, Caucasian
125 Caucasian
128 General Market
我通过案例陈述定义了新值:
USE Main;
(Select CASE
When LE.Name is null THEN 'General Market'
When LE.Name = 'African' THEN 'African American'
When LE.Name = 'American Indian/Native American' Then 'American Indian'
WHEN LE.NAME = 'Cambodian' Then 'Asian'
When LE.Name = 'Chinese' Then 'Asian'
When LE.Name = 'Filipino' Then 'Asian'
When LE.Name = 'Hmong' Then 'Asian'
WHEN LE.NAME = 'Japanese' THEN 'Asian'
WHEN LE.Name = 'Korean' Then 'Asian'
WHEN LE.Name = 'Laotian' Then 'Asian'
WHEN LE.Name = 'Vietnamese' Then 'Asian'
WHEN LE.Name = 'Armenian' Then 'Other'
WHEN LE.Name = 'Russian' Then 'Other'
WHEN LE.Name = 'Ukranian' Then 'Other'
WHEN LE.Name = 'Other (specify)' Then 'Other'
Else LE.Name
End 'Ethnicity'
From ActivityDemographicEthnicity ADE
LEFT JOIN LookupEthnicity LE
ON LE.ID = ADE.ID)`
两个查询都单独工作,但如何将它们组合成一个查询?我假设您可以简单地将原始查询对
LE.Name
字段的调用替换为CASE
语句,如下所示:
USE MAIN;
SELECT
ACT.ID AS Activity,
STUFF
(
(
SELECT ',' +
CASE
When LE.Name is null THEN 'General Market'
When LE.Name = 'African' THEN 'African American'
When LE.Name = 'American Indian/Native American' Then 'American Indian'
WHEN LE.NAME = 'Cambodian' Then 'Asian'
When LE.Name = 'Chinese' Then 'Asian'
When LE.Name = 'Filipino' Then 'Asian'
When LE.Name = 'Hmong' Then 'Asian'
WHEN LE.NAME = 'Japanese' THEN 'Asian'
WHEN LE.Name = 'Korean' Then 'Asian'
WHEN LE.Name = 'Laotian' Then 'Asian'
WHEN LE.Name = 'Vietnamese' Then 'Asian'
WHEN LE.Name = 'Armenian' Then 'Other'
WHEN LE.Name = 'Russian' Then 'Other'
WHEN LE.Name = 'Ukranian' Then 'Other'
WHEN LE.Name = 'Other (specify)' Then 'Other'
ELSE LE.Name
END AS [text()]
FROM
ActivityDemographicEthnicity ADE
LEFT OUTER JOIN
LookupEthnicity LE ON
LE.ID = ADE.ethinicityId
WHERE ACT.ID = ADE.ActivityID
FOR XML PATH ('')
),1,1,''
) AS Ethnicity
FROM Activity ACT
这对你有用吗?试一试:
Select ACT.ID AS Activity,
ISNULL(STUFF((Select distinct ',' + CASE
When LE.Name is null THEN 'General Market'
When LE.Name = 'African' THEN 'African American'
When LE.Name = 'American Indian/Native American' Then 'American Indian'
WHEN LE.NAME = 'Cambodian' Then 'Asian'
When LE.Name = 'Chinese' Then 'Asian'
When LE.Name = 'Filipino' Then 'Asian'
When LE.Name = 'Hmong' Then 'Asian'
WHEN LE.NAME = 'Japanese' THEN 'Asian'
WHEN LE.Name = 'Korean' Then 'Asian'
WHEN LE.Name = 'Laotian' Then 'Asian'
WHEN LE.Name = 'Vietnamese' Then 'Asian'
WHEN LE.Name = 'Armenian' Then 'Other'
WHEN LE.Name = 'Russian' Then 'Other'
WHEN LE.Name = 'Ukranian' Then 'Other'
WHEN LE.Name = 'Other (specify)' Then 'Other'
ELSE LE.Name
END
FROM ActivityDemographicEthnicity ADE
LEFT OUTER JOIN LookupEthnicity LE ON LE.ID = ADE.ethnicityId
WHERE ACT.ID = ADE.ActivityID
FOR XML PATH ('')),1,1,''), 'General Market') AS Ethnicity
FROM Activity ACT
您需要将整个STUFF
函数包装在ISNULL
中,以捕获某个活动没有相应ActivityDemographics属性的情况。然后在文件中选择distinct
,以删除重复文件
顺便说一句,谢谢你。它没有语法错误,但是它给出了“Asian,Asian,Latino”而不是“Asian,Latino”,并且它不考虑空值。很抱歉,没有意识到区分是一个要求。我不会更新我的原始答案,因为@Jerrad的评论做了适当的更改,他甚至使用了SQL FIDLE:)他的代码看起来很好。这非常有效。昨晚我睡着的时候,我突然想到了整件事,但我还没弄清楚到底是什么!我很感激你对所需的更改做出了解释!