Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2016-如何进行简单的透视_Sql_Sql Server_Sql Server 2016 - Fatal编程技术网

SQL Server 2016-如何进行简单的透视

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 | +---+--------+--------+ |

我查看了许多其他示例,但它们的pivot查询中总是有某种
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