我正在使用SQL SERVER 2008 R2。我希望得到多个值,并在同一时间逐行显示在单列中,如果值存在,则显示一些值,并且可能是单个列上'12值'的可能性。
例如,下面的屏幕截图,它显示除评论之外的相同数据的记录。我想显示为 单条记录, 但评论应显示 ASN及时性,ASN准确性,问题报告这两个值。这三个值使用相同的船舶“0096a”逐行显示。
我的示例查询,
SELECT
D30.SPGD30_SHIP_SITE_C AS SHIPSITE,
D30.SPGD30_RATING_MONTH_Y AS RATINGMONTH,
D30.SPGD30_PRIOR_SCORE_R AS PRIOR,
D30.SPGD30_REVISED_SCORE_R AS REVISED,
CASE WHEN (CHARINDEX('-',D30.SPGD30_TRACKED_ADJUSTMENT_X) > 0 ) THEN CONVERT( VARCHAR(8), CAST(D30.SPGD30_TRACKED_ADJUSTMENT_X AS DATETIME) , 1) ELSE D30.SPGD30_TRACKED_ADJUSTMENT_X END ADJUSTMENTS,
J02.SPGJ02_MSG_CODE_X AS COMMENTS,
D30.SPGD30_LAST_TOUCH_Y AS LASTUPDATED,
D30.SPGD30_LAST_TOUCH_C AS LASTUPDATEDCDSID
FROM
CSPGD30_TRACKING D30,
CSPGD31_TRACKING_RATING_ELEMNT D31,
CSPGA04_RATING_ELEMENT_MSTR A04 ,
CSPGJ02_MSG_OBJ J02
WHERE
D30.SPGA02_BUSINESS_TYPE_C = D31.SPGA02_BUSINESS_TYPE_C
AND
D30.SPGA03_REGION_C = D31.SPGA03_REGION_C
AND
D30.SPGD30_SHIP_SITE_C = D31.SPGD30_SHIP_SITE_C
AND
D30.SPGD30_RATING_MONTH_Y = D31.SPGD30_RATING_MONTH_Y
AND
D30.SPGD30_TRACKED_ADJUSTMENT_X = D31.SPGD30_TRACKED_ADJUSTMENT_X
AND
D30.SPGD30_LAST_TOUCH_Y = D31.SPGD30_LAST_TOUCH_Y
AND
D31.SPGA04_RATING_ELEMENT_D = A04.SPGA04_RATING_ELEMENT_D
AND
A04.SPGJ02_MSG_K = J02.SPGJ02_MSG_K
AND
D30.SPGA02_BUSINESS_TYPE_C = 'serv'
AND
D30.SPGA03_REGION_C = 'ap'
AND
D30.SPGD30_SHIP_SITE_C = '0134a'
ORDER BY
D30.SPGD30_SHIP_SITE_C ASC ,
D30.SPGD30_RATING_MONTH_Y DESC ,
D30.SPGD30_LAST_TOUCH_Y DESC
答案 0 :(得分:7)
我认为有两种方法可以做到这一点。
首先,您可以在相关子查询中使用FOR XML PATH
和STUFF
。这会将CSPGJ02_MSG_OBJ
中的值连接成一个字符串:
SELECT D30.SPGD30_SHIP_SITE_C AS SHIPSITE,
D30.SPGD30_RATING_MONTH_Y AS RATINGMONTH,
D30.SPGD30_PRIOR_SCORE_R AS PRIOR,
D30.SPGD30_REVISED_SCORE_R AS REVISED,
CASE WHEN (CHARINDEX('-',D30.SPGD30_TRACKED_ADJUSTMENT_X) > 0 ) THEN CONVERT( VARCHAR(8), CAST(D30.SPGD30_TRACKED_ADJUSTMENT_X AS DATETIME) , 1) ELSE D30.SPGD30_TRACKED_ADJUSTMENT_X END ADJUSTMENTS,
STUFF((SELECT distinct '+ ' + J02.SPGJ02_MSG_CODE_X
from CSPGJ02_MSG_OBJ J02
where A04.SPGJ02_MSG_K = J02.SPGJ02_MSG_K
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,2,'') COMMENTS,
D30.SPGD30_LAST_TOUCH_Y AS LASTUPDATED,
D30.SPGD30_LAST_TOUCH_C AS LASTUPDATEDCDSID
FROM CSPGD30_TRACKING D30
INNER JOIN CSPGD31_TRACKING_RATING_ELEMNT D31
ON D30.SPGA02_BUSINESS_TYPE_C = D31.SPGA02_BUSINESS_TYPE_C
AND D30.SPGA03_REGION_C = D31.SPGA03_REGION_C
AND D30.SPGD30_SHIP_SITE_C = D31.SPGD30_SHIP_SITE_C
AND D30.SPGD30_RATING_MONTH_Y = D31.SPGD30_RATING_MONTH_Y
AND D30.SPGD30_TRACKED_ADJUSTMENT_X = D31.SPGD30_TRACKED_ADJUSTMENT_X
AND D30.SPGD30_LAST_TOUCH_Y = D31.SPGD30_LAST_TOUCH_Y
INNER JOIN CSPGA04_RATING_ELEMENT_MSTR A04
ON D31.SPGA04_RATING_ELEMENT_D = A04.SPGA04_RATING_ELEMENT_D
WHERE D30.SPGA02_BUSINESS_TYPE_C = 'serv'
AND D30.SPGA03_REGION_C = 'ap'
AND D30.SPGD30_SHIP_SITE_C = '0134a'
ORDER BY D30.SPGD30_SHIP_SITE_C ASC, D30.SPGD30_RATING_MONTH_Y DESC, D30.SPGD30_LAST_TOUCH_Y DESC;
第二种方法是使用CROSS APPLY
和FOR XML PATH
:
SELECT D30.SPGD30_SHIP_SITE_C AS SHIPSITE,
D30.SPGD30_RATING_MONTH_Y AS RATINGMONTH,
D30.SPGD30_PRIOR_SCORE_R AS PRIOR,
D30.SPGD30_REVISED_SCORE_R AS REVISED,
CASE WHEN (CHARINDEX('-',D30.SPGD30_TRACKED_ADJUSTMENT_X) > 0 ) THEN CONVERT( VARCHAR(8), CAST(D30.SPGD30_TRACKED_ADJUSTMENT_X AS DATETIME) , 1) ELSE D30.SPGD30_TRACKED_ADJUSTMENT_X END ADJUSTMENTS,
left(J02.comments, LEN(J02.comments)-1) AS COMMENTS,
D30.SPGD30_LAST_TOUCH_Y AS LASTUPDATED,
D30.SPGD30_LAST_TOUCH_C AS LASTUPDATEDCDSID
FROM CSPGD30_TRACKING D30
INNER JOIN CSPGD31_TRACKING_RATING_ELEMNT D31
ON D30.SPGA02_BUSINESS_TYPE_C = D31.SPGA02_BUSINESS_TYPE_C
AND D30.SPGA03_REGION_C = D31.SPGA03_REGION_C
AND D30.SPGD30_SHIP_SITE_C = D31.SPGD30_SHIP_SITE_C
AND D30.SPGD30_RATING_MONTH_Y = D31.SPGD30_RATING_MONTH_Y
AND D30.SPGD30_TRACKED_ADJUSTMENT_X = D31.SPGD30_TRACKED_ADJUSTMENT_X
AND D30.SPGD30_LAST_TOUCH_Y = D31.SPGD30_LAST_TOUCH_Y
INNER JOIN CSPGA04_RATING_ELEMENT_MSTR A04
ON D31.SPGA04_RATING_ELEMENT_D = A04.SPGA04_RATING_ELEMENT_D
CROSS APPLY
(
select J02.SPGJ02_MSG_CODE_X + ', '
from CSPGJ02_MSG_OBJ J02
where A04.SPGJ02_MSG_K = J02.SPGJ02_MSG_K
FOR XML PATH('')
) J02 (comments)
WHERE D30.SPGA02_BUSINESS_TYPE_C = 'serv'
AND D30.SPGA03_REGION_C = 'ap'
AND D30.SPGD30_SHIP_SITE_C = '0134a'
ORDER BY D30.SPGD30_SHIP_SITE_C ASC, D30.SPGD30_RATING_MONTH_Y DESC, D30.SPGD30_LAST_TOUCH_Y DESC;
注意:您会注意到我将查询更改为使用JOIN
语法而不是逗号分隔表与WHERE
子句中的联接。这是标准的ANSI语法。
答案 1 :(得分:0)
使用XML PATH('')
SELECT
D30.SPGD30_SHIP_SITE_C AS SHIPSITE,
D30.SPGD30_RATING_MONTH_Y AS RATINGMONTH,
D30.SPGD30_PRIOR_SCORE_R AS PRIOR,
D30.SPGD30_REVISED_SCORE_R AS REVISED,
CASE WHEN (CHARINDEX('-',D30.SPGD30_TRACKED_ADJUSTMENT_X) > 0 ) THEN CONVERT( VARCHAR(8), CAST(D30.SPGD30_TRACKED_ADJUSTMENT_X AS DATETIME) , 1) ELSE D30.SPGD30_TRACKED_ADJUSTMENT_X END ADJUSTMENTS,
STUFF(JO2.COMMENTS, 1, 1, '') AS COMMENTS,
D30.SPGD30_LAST_TOUCH_Y AS LASTUPDATED,
D30.SPGD30_LAST_TOUCH_C AS LASTUPDATEDCDSID
FROM
CSPGD30_TRACKING D30
CROSS JOIN CSPGD31_TRACKING_RATING_ELEMNT D31
CROSS JOIN CSPGA04_RATING_ELEMENT_MSTR A04
CROSS APPLY (
SELECT
',' + ISNULL(JO2.SPGJ02_MSG_CODE_X, '')
FROM CSPGJ02_MSG_OBJ JO2
WHERE A04.SPGJ02_MSG_K = JO2.SPGJ02_MSG_K
FOR XML PATH('')
) AS JO2 (COMMENTS)
WHERE
D30.SPGA02_BUSINESS_TYPE_C = D31.SPGA02_BUSINESS_TYPE_C
AND
D30.SPGA03_REGION_C = D31.SPGA03_REGION_C
AND
D30.SPGD30_SHIP_SITE_C = D31.SPGD30_SHIP_SITE_C
AND
D30.SPGD30_RATING_MONTH_Y = D31.SPGD30_RATING_MONTH_Y
AND
D30.SPGD30_TRACKED_ADJUSTMENT_X = D31.SPGD30_TRACKED_ADJUSTMENT_X
AND
D30.SPGD30_LAST_TOUCH_Y = D31.SPGD30_LAST_TOUCH_Y
AND
D31.SPGA04_RATING_ELEMENT_D = A04.SPGA04_RATING_ELEMENT_D
AND
D30.SPGA02_BUSINESS_TYPE_C = 'serv'
AND
D30.SPGA03_REGION_C = 'ap'
AND
D30.SPGD30_SHIP_SITE_C = '0134a'
ORDER BY
D30.SPGD30_SHIP_SITE_C ASC ,
D30.SPGD30_RATING_MONTH_Y DESC ,
D30.SPGD30_LAST_TOUCH_Y DESC
这个将以逗号分隔的评论列表。
答案 2 :(得分:0)
如果要在一个列中显示多个列,可以这样写:
SELECT CAST([MyIntegerId] AS varchar(10)) + ' - ' + [Column1]+ ' - ' +CAST([MyDateTimeColumn] AS varchar(10)) + ' - ' + [Column2] AS 'My Merged Column'
FROM Mytable
如果您想将多列分组为单个列作为字符串 - 这个article可以帮助您: