我有一张有多个列的表,可以识别受伤的身体区域:
ID head face thor abdo spine area injured
4721 5 0 5 3 0 multiple
4723 0 0 0 3 3 multiple
4737 0 0 1 3 0 abdo
4752 0 2 0 0 0 face目前,面积损伤列是以包含最高值的列为基础的,如果两列具有联合最高值,则列出“倍数”。
我想更改“受伤区域”列,并列出实际的身体区域,而不是“多个”,例如:
ID head face thor abdo spine area injured
4721 5 0 5 3 0 head, thor
4723 0 0 0 3 3 abdo, spine
4737 0 0 1 3 0 abdo
4752 0 2 0 0 0 face如何比较五列,以确定哪些列的值最高?
发布于 2015-09-30 11:08:40
一种方法是使用CASE表达式查找值最大的列:
SQL Fiddle
SELECT *,
[area injured] =
STUFF((
CASE WHEN head >= face AND head >= thor AND head >= abdo AND head >= spine THEN ', head' ELSE '' END +
CASE WHEN face >= head AND face >= thor AND face >= abdo AND face >= spine THEN ', face' ELSE '' END +
CASE WHEN thor >= head AND thor >= face AND thor >= abdo AND thor >= spine THEN ', thor' ELSE '' END +
CASE WHEN abdo >= head AND abdo >= face AND abdo >= thor AND abdo >= spine THEN ', abdo' ELSE '' END +
CASE WHEN spine >= head AND spine >= face AND spine >= abdo AND spine >= thor THEN ', spine' ELSE '' END
), 1, 2, '')
FROM tbl另一种更动态的方法是对数据进行UNPIVOT,并使用RANK获取值最高的列。然后,使用FOR XML PATH('')进行连接:
SQL Fiddle
WITH CteUnpivot AS(
SELECT
t.ID, x.col, x.value
FROM tbl t
CROSS APPLY(VALUES
('head', t.head),
('face', t.face),
('thor', t.thor),
('abdo', t.abdo),
('spine', t.spine)
)x(col, value)
),
CteRn AS(
SELECT *,
rn = RANK() OVER(PARTITION BY ID ORDER BY value DESC)
FROM CteUnpivot
)
SELECT
c.ID,
[area injured] =
STUFF((
SELECT ', ' + col
FROM CteRn
WHERE
ID = c.ID
AND rn = 1
FOR XML PATH('')
),1 ,2, '')
FROM CteRn c
GROUP BY c.ID发布于 2015-09-30 11:27:56
要在UPDATE列中使用area_injured值,可以使用:
SqlFiddleDemo
WITH cte AS
(
SELECT ID
,area_injured = REPLACE((SELECT
IIF(t1.head = cr.val, 'head, ', '') +
IIF(t1.face = cr.val, 'face, ', '') +
IIF(t1.thor = cr.val, 'thor, ', '') +
IIF(t1.abdo = cr.val, 'abdo, ', '') +
IIF(t1.spine = cr.val, 'spine, ', '') + ';'
FROM tab t1
WHERE t.ID = t1.ID), ', ;', '')
FROM tab t
CROSS APPLY(SELECT MAX(v)
FROM (VALUES (t.head),
(t.face),
(t.thor),
(t.abdo),
(t.spine)) AS c(v)) AS cr(val)
)
UPDATE t
SET area_injured = c.area_injured
FROM tab t
JOIN cte c
ON t.id = c.id;
SELECT *
FROM tab;CROSS APPLY将从带有主体部件的列中获取MAX值。area_injured字符串发布于 2015-09-30 11:50:14
您可以使用UNPIVOT来实现这一点。
SQL Fiddle
WITH CTE2 AS
(
SELECT * FROM
(SELECT ID,HEAD,FACE,THOR,ABDO,SPINE
FROM PARTSDATA) T
UNPIVOT
( QUANTITY FOR PART IN
(HEAD,FACE,THOR ,ABDO , SPINE)
) AS U
),
CTE3 AS
(
SELECT RANK() OVER(PARTITION BY ID ORDER BY QUANTITY DESC) AS RN,QUANTITY,PART,ID
FROM CTE2
)
SELECT DISTINCT C1.ID,STUFF(DT.CONTENT,1,1,'') AS [AREA INJURED]
FROM CTE3 C1
CROSS APPLY(SELECT ','+PART
FROM CTE3
WHERE ID = C1.ID AND RN=1 FOR XML PATH(''))DT(CONTENT)
WHERE RN=1https://stackoverflow.com/questions/32864467
复制相似问题