簡體   English   中英

SQL 服務器 2016 - 如何做一個簡單的 pivot

[英]SQL Server 2016 - How to do a simple pivot

我查看了許多其他示例,但他們的 pivot 查詢中總是有某種AVGSUM 而且我不知道如何在我的情況下應用它。 那里有很多例子,但我無法讓它發揮作用。 我的查詢有什么問題?

我只是在尋找 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生成一條記錄,以及它的Level1Level2值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM