根据单个/相同表中sql server中的重复ID,将几行转换为单行

时间:2014-06-13 09:14:13

标签: sql sql-server

我将使用两种不同的类别代码对特定Id进行一些关节计算。

所以我将以下两行作为输入,

enter image description here

我期待以下输出为,

enter image description here

我正在努力做一些自我加入,但我没有幸运地获得所需的输出。

你能帮助我吗?

注意:特定ID只会有两行(两种类别会来[A或C])。

2 个答案:

答案 0 :(得分:2)

方法1:

试试这个

SELECT * 
FROM Table1
Pivot (MAX(value) for Category in ([A],[C])) as Value

<强> Fiddle Demo

<强>输出:


  +-------------+-------+-------+
  | ID          | A     |C      |
  +-------------+-------+-------+
  | WD559606479 | 0.748 |2.088  |
  +-------------+-------+-------+

方法2: 动态数据透视

如果输入中还有一列,则

试试这个

DECLARE @cols AS NVARCHAR(MAX)
DECLARE @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category) 
            FROM table1 c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query ='SELECT id, ' + @cols + ' from 
            (
                SELECT id
                    , category
                    , value
                FROM table1
            ) x
            Pivot 
            (
                Max(value)
                For category In (' + @cols + ')
            ) P'       
Execute(@query)

<强> Fiddle Demo

<强>输出:


  +-------------+-------+-------+
  | ID          | A     |C      |
  +-------------+-------+-------+
  | WD559606479 | 0.748 |2.088  |
  +-------------+-------+-------+

答案 1 :(得分:2)

  

特定ID只会有两行(两种类别将会出现   来[A或C])。

然后这个查询就足够了:

SELECT ID,
       ValueA = SUM(CASE WHEN Category = 'A' THEN Value END),
       ValueC = SUM(CASE WHEN Category = 'C' THEN Value END)
FROM dbo.TableName
GROUP BY ID

Sql-Fiddle