SQL Pivot只选择行

时间:2017-01-25 21:37:30

标签: sql-server sql-server-2012 pivot

我正在尝试转动数据库,以便只有某些行成为列。以下是我的表格:

ID  QType       CharV       NumV
1   AccNum                  10
1   EmpNam      John Inc    0
1   UW          Josh        0
2   AccNum                  11
2   EmpNam      CBS         0
2   UW          Dan         0

我希望桌子看起来像这样:

ID  AccNum      EmpNam
1   10          John Inc
2   11          CBS 

我想解决两个主要问题。

1st:我想要获得的值并不总是在同一列中。因此,虽然AccNum始终位于NumV列中,但EmpName始终位于CharV列中。

第二:我需要找到一种方法来忽略我不想要的数据。在这个例子中,它将是QType列中带有UW的行。

以下是我的代码:

SELECT *
  FROM testTable
    Pivot(
    MAX(NumV)
    FOR[QType]
    In ([AccNum],[TheValue])
    )p

但它给了我以下结果:

ID  CharV   AccNum  TheValue
1           10      NULL
2           11      NULL
2   CBS     NULL    NULL
2   Dan     NULL    NULL
1   John IncNULL    NULL
1   Josh    NULL    NULL

1 个答案:

答案 0 :(得分:3)

在这种情况下,使用条件聚合进行分组应该有效。尝试类似:

SELECT ID
, MAX(CASE WHEN QType = 'AccNum' THEN NumV END) AS AccNum
, MAX(CASE WHEN QType = 'EmpNam' THEN CharV END) AS EmpNam
FROM testTable
GROUP BY ID

由于内部CASE仅在满足WHEN条件时获得一个值,MAX函数将为您提供所需的值。当然,只有每个ID只有唯一的QType时才会起作用。

通常在条件复杂的情况下,在Sql-Server中使用PIVOT不能一步完成,特别是当您需要来自不同列的值时。你可以在两个查询中转移你的表并加入它们,但它的表现很差,而且比我的建议更不易读。