首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当两个值匹配时,SQL server比较多列并显示文本。

当两个值匹配时,SQL server比较多列并显示文本。
EN

Stack Overflow用户
提问于 2015-09-30 11:03:10
回答 3查看 10.3K关注 0票数 1

我有一张有多个列的表,可以识别受伤的身体区域:

代码语言:javascript
复制
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

目前,面积损伤列是以包含最高值的列为基础的,如果两列具有联合最高值,则列出“倍数”。

我想更改“受伤区域”列,并列出实际的身体区域,而不是“多个”,例如:

代码语言:javascript
复制
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

如何比较五列,以确定哪些列的值最高?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-30 11:08:40

一种方法是使用CASE表达式查找值最大的列:

SQL Fiddle

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2015-09-30 11:27:56

要在UPDATE列中使用area_injured值,可以使用:

SqlFiddleDemo

代码语言:javascript
复制
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;
  1. CROSS APPLY将从带有主体部件的列中获取MAX值。
  2. 关联子查询生成area_injured字符串
  3. 基于Id更新原始表
票数 1
EN

Stack Overflow用户

发布于 2015-09-30 11:50:14

您可以使用UNPIVOT来实现这一点。

SQL Fiddle

代码语言:javascript
复制
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=1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32864467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档