Sql server 2008 更改单元格的值,然后连接成一行SQL Server 2008

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

所以我试图同时做几件事,但我不知道如何把它们组合起来

我的第一步是根据id将多个单元格合并成一行

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:)他的代码看起来很好。这非常有效。昨晚我睡着的时候,我突然想到了整件事,但我还没弄清楚到底是什么!我很感激你对所需的更改做出了解释!