本文介紹了SQL Server 2016-如何進(jìn)行簡(jiǎn)單的透視的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我查看了許多其他示例,但它們的透視查詢中總是有某種AVG
或SUM
。我想不出該怎么把它應(yīng)用到我的案例中。有很多例子,但我不能讓它工作。我的查詢有什么問(wèn)題?
我只是想透視表(查詢: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
但它收到此錯(cuò)誤:
Incorrect syntax near the keyword 'for'.
感謝任何幫助,謝謝!
推薦答案
所有類型的透視表都需要條件聚合。這是您的RDBMS需要將多行集合為一行的唯一方法。
一些RDBMS提供特定于供應(yīng)商的函數(shù)來(lái)實(shí)現(xiàn)透視邏輯(SQL Server是其中之一,就像Oracle一樣)。但它們基本上只是基本概念之上的句法糖,這總是歸結(jié)為條件聚合。
我通常反對(duì)這些特定于供應(yīng)商的實(shí)現(xiàn),因?yàn)樗鼈儙缀鯖](méi)有增加查詢的復(fù)雜性,并且在可移植性(和可讀性,除非您是該特定語(yǔ)言的專家)方面有很大損失。
這是一個(gè)透視數(shù)據(jù)的標(biāo)準(zhǔn)解決方案,即使不是所有RDBMS,也適用于大多數(shù)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
您可以輕松地將此查詢過(guò)程同時(shí)處理多個(gè)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
這將為每個(gè)orgstructureid
生成一條記錄及其Level1
和Level2
值。
這篇關(guān)于SQL Server 2016-如何進(jìn)行簡(jiǎn)單的透視的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,