【问题标题】:Combining multiple row values into a single column将多个行值组合到单个列中
【发布时间】:2015-09-18 12:02:32
【问题描述】:

我很感激以前有人问过类似的问题,但我不确定接下来要尝试什么,并且承受着一些压力。我正在尝试将多个行值组合到一个列中,为此我正在尝试使用 XML Path。以下是我必须要做的,但我现在只是在单个列中显示多个主题的多个实例。

使用 SQL Server,我想将给定学生(大约 10 名)的所有科目合并到“所有科目”列中。有人可以指出我哪里出错了吗?谢谢,加文

SELECT distinct
P.FORM AS Class, 
NAME.NAME AS [Pupil Name], 
(SELECT ';' + SS.DESCRIPTION
FROM PUPIL P 
INNER JOIN PUPIL_SET PS on PS.PUPIL_ID = P.PUPIL_ID
INNER JOIN SUBJECT_SET SS on SS.SUBJECT_SET_ID = PS.SUBJECT_SET_ID 
FOR XML PATH('')) [All Subjects],
NAME_1.TITLE + ' ' + NAME_1.FIRST_NAMES + ' ' + NAME_1.SURNAME AS [Parent or     Carer Name],
Replace(isnull(ADDRESS.HOUSE_STREET,'') + ', ' +     isnull(ADDRESS.VILLAGE_AREA,'') + ', ' + isnull(ADDRESS.TOWN_CITY,'') + ', ' +     isnull(ADDRESS.COUNTY,'') + ', ' + isnull(ADDRESS.COUNTRY,'') + ' ' +     isnull(ADDRESS.POST_CODE,''),',,', '') AS Address,
--RELATIONSHIP.RANK,
CASE WHEN NAME.MAIN_ADDRESS_ID = NAME_1.MAIN_ADDRESS_ID THEN 'HOME' ELSE    'OTHER' END AS [Home or Other]
FROM PUPIL P
INNER JOIN NAME ON P.NAME_ID = NAME.NAME_ID
INNER JOIN ADDRESS ON NAME.MAIN_ADDRESS_ID = ADDRESS.ADDRESS_ID
INNER JOIN RELATIONSHIP ON NAME.NAME_ID = RELATIONSHIP.FROM_NAME_ID
INNER JOIN NAME AS NAME_1 ON RELATIONSHIP.TO_NAME_ID = NAME_1.NAME_ID
INNER JOIN PUPIL_SET PS on PS.PUPIL_ID = P.PUPIL_ID
INNER JOIN SUBJECT_SET SS on SS.SUBJECT_SET_ID = PS.SUBJECT_SET_ID
WHERE 
(RELATIONSHIP.RANK=1 Or RELATIONSHIP.RANK=2) 
AND P.ACADEMIC_YEAR=YEAR(DateAdd(m,-5,getDate()))
AND P.SUB_SCHOOL='030SEN' 
AND P.IN_USE='y' 
AND P.RECORD_TYPE='1' 
AND Len(P.FORM)>0
and p.ACADEMIC_YEAR = 2015; 

【问题讨论】:

    标签: sql sql-server xml


    【解决方案1】:

    首先,子查询中只需要subject_setpupil_set,外部查询不需要。

    其次,您需要一个关联子句。所以,是这样的:

    SELECT P.FORM AS Class,
           . . .
           (SELECT ';' + SS.DESCRIPTION
            FROM PUPIL_SET PS INNER JOIN
                 SUBJECT_SET SS
                 on SS.SUBJECT_SET_ID = PS.SUBJECT_SET_ID 
            WHERE PS.PUPIL_ID = P.PUPIL_ID
            FOR XML PATH('')
           ) [All Subjects],
           . . .
    FROM PUPIL P INNER JOIN
         NAME
         ON P.NAME_ID = NAME.NAME_ID INNER JOIN
         ADDRESS
         ON NAME.MAIN_ADDRESS_ID = ADDRESS.ADDRESS_ID INNER JOIN
         RELATIONSHIP
         ON NAME.NAME_ID = RELATIONSHIP.FROM_NAME_ID INNER JOIN
         NAME AS NAME_1
         ON RELATIONSHIP.TO_NAME_ID = NAME_1.NAME_ID
    WHERE  . . .;
    

    您不需要SELECT DISTINCT。由于不必要的连接,您得到了重复。

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 2019-11-02
      • 1970-01-01
      • 2021-11-09
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多