旋轉(或取消旋轉)下表的最佳方法是什么:
CREATE TABLE dbo.Sections(
SectionId varchar(50) NOT NULL (PK),
Description varchar(255),
SubSectionIdA varchar(50),
SubSectionIdB varchar(50),
SubSectionIdC varchar(50),
SubSectionIdD varchar(50),
SubSectionIdE varchar(50)
);
并將其變成這樣的模式:
CREATE TABLE dbo.NormalizedSections(
SectionId varchar(50) NOT NULL (FK and part of PK),
Description varchar(255),
SubSectionId varchar(50) NOT NULL (other part of PK),
Order int
);
所以Sections表可以有這樣的樣本資料:
SectionId Description SubSectionIdA SubSectionIdB SubSectionIdC SubSectionIdD SubSectionIdE
--------------------------------------------------------------------------------------------------------------------------------------------------------
Sec-01A Special section NULL '' SubsectionA1 SubsectionA2 ''
Sec-02B Cheap seats CheapSeciton1 '' CheapSectionTop NULL LimitedView
Sec-01B VIP Special CourtsideSeatView NULL NULL NULL
這需要變成這樣:
SectionId Description SubSectionId Order
-------------------------------------------------------------------------------
Sec-01A Special section SubsectionA1 1
Sec-01A Special section SubsectionA2 2
Sec-02B Cheap seats CheapSeciton1 1
Sec-02B Cheap seats CheapSectionTop 2
Sec-02B Cheap seats LimitedView 3
Sec-01B VIP Special 1
Sec-01B VIP CourtsideSeatView 2
有沒有一種快速的方法可以做到這一點并將其加載到 SQL Server 中帶有一些花哨的非游標 T-SQL 的臨時表中?
uj5u.com熱心網友回復:
如果這是一次性作業,請嘗試UNPIVOT將 SubSectionId..N 列轉換為行。然后在結果中添加一個ROW_NUMBER()以按部分和小節生成訂單號
-- Unpivot the table.
SELECT unpvt.SectionId
, unpvt.Description
, unpvt.SubSection
, ROW_NUMBER() OVER(PARTITION BY SectionId ORDER BY SubSection) AS RowOrder
FROM
( SELECT SectionId
, Description
, SubSectionIdA
, SubSectionIdB
, SubSectionIdC
, SubSectionIdD
, SubSectionIdE
FROM Sections
) p
UNPIVOT
(
SubSection FOR SubSectionId
IN (SubSectionIdA
, SubSectionIdB
, SubSectionIdC
, SubSectionIdD
, SubSectionIdE
)
)AS unpvt
WHERE ISNULL(SubSection, '') <> ''
結果:
部分 ID | 說明 | 小節 | 行序 :-------- | :---------------- | :---------------- | --------: Sec-01A | 專區 | A1 小節 | 1 Sec-01A | 專區 | A2 小節 | 2 Sec-01B | 貴賓 | CourtsideSeatView | 1 Sec-01B | 貴賓 | 特別 | 2 Sec-02B | 便宜的座位 | 便宜Seciton1 | 1 Sec-02B | 便宜的座位 | 便宜部分頂部 | 2 Sec-02B | 便宜的座位 | 有限視圖 | 3
參見db<>fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/436446.html
