[英]SQL Server 2016 - How to do a simple pivot
我查看了許多其他示例,但他們的 pivot 查詢中總是有某種AVG
或SUM
。 而且我不知道如何在我的情況下應用它。 那里有很多例子,但我無法讓它發揮作用。 我的查詢有什么問題?
我只是在尋找 pivot 我的表(查詢: 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'.
任何幫助表示贊賞,謝謝!
各種pivot需要條件聚合。 這是 RDBMS 需要將多行合二為一的唯一方法。
一些 RDBMS 提供特定於供應商的函數來實現 pivot 邏輯(SQL Server 就是其中之一,就像 Oracle 一樣)。 但它們基本上只是基本思想之上的語法糖,它總是歸結為條件聚合。
我通常反對這些供應商特定的實現,因為查詢復雜性幾乎沒有收益,並且可移植性(和可讀性,除非您是該特定語言的專家)損失很大。
這是 pivot 數據的標准解決方案,它適用於大多數(如果不是全部)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
值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.