SQL Server 2016-如何进行简单的透视
我查看了许多其他示例,但它们的pivot查询中总是有某种SQL Server 2016-如何进行简单的透视,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我查看了许多其他示例,但它们的pivot查询中总是有某种AVG或SUM。我不知道如何在我的案例中应用它。有很多例子,但我无法让它发挥作用。我的问题出了什么问题 我只是想透视我的表(查询:SELECT LevelName,ParentNodeName from vOrgStructurePath,其中orgstructureid=1545): 为此: +---+--------+--------+ | | Level1 | Level2 | +---+--------+--------+ |
AVG
或SUM
。我不知道如何在我的案例中应用它。有很多例子,但我无法让它发挥作用。我的问题出了什么问题
我只是想透视我的表(查询:SELECT LevelName,ParentNodeName from vOrgStructurePath,其中orgstructureid=1545
):
为此:
+---+--------+--------+
| | 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'.
感谢您的帮助,谢谢 所有类型的数据透视都需要条件聚合。这是您的RDBMS需要将多行集合到一行中的唯一方法 一些RDBMS提供了实现pivot逻辑的特定于供应商的功能(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
生成一条记录,以及它的Level1
和Level2
值。这太神奇了,我仍在试图弄清楚它到底是如何工作的,但它是如何工作的!携带方便多了。
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