本文介紹了SQL Server 2016-如何進行簡單的透視的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我查看了許多其他示例,但它們的透視查詢中總是有某種AVG
或SUM
。我想不出該怎么把它應用到我的案例中。有很多例子,但我不能讓它工作。我的查詢有什么問題?
我只是想透視表(查詢: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'.
感謝任何幫助,謝謝!
推薦答案
所有類型的透視表都需要條件聚合。這是您的RDBMS需要將多行集合為一行的唯一方法。
一些RDBMS提供特定于供應商的函數來實現透視邏輯(SQL Server是其中之一,就像Oracle一樣)。但它們基本上只是基本概念之上的句法糖,這總是歸結為條件聚合。
我通常反對這些特定于供應商的實現,因為它們幾乎沒有增加查詢的復雜性,并且在可移植性(和可讀性,除非您是該特定語言的專家)方面有很大損失。
這是一個透視數據的標準解決方案,即使不是所有RDBMS,也適用于大多數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
值。
這篇關于SQL Server 2016-如何進行簡單的透視的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,