【问题标题】:SQL Pivot only select rowsSQL Pivot 仅选择行
【发布时间】:2017-01-25 21:37:29
【问题描述】:

我正在尝试对数据库进行透视,以便只有某些行成为列。下面是我的表格的样子:

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 

我要解决两个主要问题。

第一个:我试图获得的值并不总是在同一列中。因此,虽然 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

【问题讨论】:

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


    【解决方案1】:

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

    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 不能一步到位,特别是当您需要来自不同列的值时。您可以在两个查询中旋转您的表并加入这些查询,但它的性能很差,而且比我的建议更易读。

    【讨论】:

    • 谢谢你这工作完美!感谢您给我最简单最简单的答案,而不是我想的那样。
    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 2011-08-28
    • 2021-02-16
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多