首页 > 解决方案 > SQL Server 2016 - 如何做一个简单的数据透视

问题描述

我查看了许多其他示例,但它们总是有某种AVGSUM在他们的数据透视查询中。而且我不知道如何在我的情况下应用它。那里有很多例子,但我无法让它发挥作用。我的查询有什么问题?

我只是想旋转我的表(查询:)SELECT LevelName, ParentNodeName from vOrgStructurePath where orgstructureid = 1545

+---+-----------+----------------+
|   | LevelName | ParentNodeName |
+---+-----------+----------------+
| 1 | Level1    | Rough          |
+---+-----------+----------------+
| 2 | Level2    | Soft           |
+---+-----------+----------------+

对此:

+---+--------+--------+
|   | Level1 | Level2 |
+---+--------+--------+
| 1 | Rough  | Soft   |
+---+--------+--------+

这是我的尝试:

SELECT LevelName, ParentNodeName from vOrgStructurePath 
 PIVOT (LevelName for ParentNodeName IN ([Level1],[Level2])) as level
 where orgstructureid = 1545 

但它得到了这个错误:

Incorrect syntax near the keyword 'for'.

任何帮助表示赞赏,谢谢!

标签: sqlsql-serversql-server-2016

解决方案


各种枢轴都需要条件聚合。这是 RDBMS 需要将多行合二为一的唯一方法。

一些 RDBMS 提供特定于供应商的函数来实现数据透视逻辑(SQL Server 就是其中之一,就像 Oracle 一样)。但它们基本上只是基本思想之上的语法糖,它总是归结为条件聚合。

我通常反对这些供应商特定的实现,因为查询复杂性几乎没有收益,并且可移植性(和可读性,除非您是该特定语言的专家)损失很大。

这是一个数据透视的标准解决方案,它适用于大多数(如果不是全部)RDBMS:

SELECT
    MAX(CASE WHEN LevelName = 'Level1' THEN ParentNodeName END) as [Level1],
    MAX(CASE WHEN LevelName = 'Level2' THEN ParentNodeName END) as [Level2]
FROM vOrgStructurePath 
WHERE orgstructureid = 1545 

orgstructureid通过如下更改,您可以轻松地一次拥有多个此查询过程:

SELECT
    orgstructureid,
    MAX(CASE WHEN LevelName = 'Level1' THEN ParentNodeName END) as [Level1],
    MAX(CASE WHEN LevelName = 'Level2' THEN ParentNodeName END) as [Level2]
FROM vOrgStructurePath 
GROUP BY orgstructureid

这会为每个 生成一条记录orgstructureid,以及它的Level1Level2值。


推荐阅读