[英]SQL query 1:N references
我在看什么
我想知道是否可以創建一個SELECT來在一行中顯示來自2個表的以下信息:
偽代碼 :
SELECT
Data_Car,
Car_Holders_Data
FROM Car, Holder_Data
WHERE
Car.License_PLate_PK = Holder_Data.License_Plate.FK
我的桌子
CAR(License_Plate_PK, Frame, Car_Info)
Holder_Data(License_Plate_FK, Holder_Data)
我的結果
License_Plate | Frame | Car_Info's | Holder_Name
AA001AA VF7UA9HR8CJ615652 Car Things Mario Rossi
AA001AA VF7UA9HR8CJ615652 Same Car Things Luigi Verdi
我想實現的目標
License_Plate | Frame | Car_Info's | Holder_Name1 | Holder Name2
AA001 VF7UA9HR8CJ615652 Car Things Mario Rossi Luigi Verdi
(我之所以寫汽車用品,只是因為我有30列有關汽車信息的欄目。為了簡化起見,您可以輕松地忽略該欄)
我知道如果有2個或更多Holder,我的查詢將返回2個或更多行。 有沒有一種方法可以將所有持有人歸還同一行?
我正在使用MS SQL Management Studio 2008
SQL不允許不確定或動態更改的列數。 這意味着您需要預先確定要擁有多少個holder
列。
例如,以下代碼將透視您的holder_data
表(然后可以將其連接到您的car
表) 。 它假定最多三個持有人。
SELECT
license_plate,
MAX(CASE WHEN row_id = 1 THEN name END) AS holder_1_name,
MAX(CASE WHEN row_id = 1 THEN address END) AS holder_1_address,
MAX(CASE WHEN row_id = 2 THEN name END) AS holder_2_name,
MAX(CASE WHEN row_id = 2 THEN address END) AS holder_2_address,
MAX(CASE WHEN row_id = 3 THEN name END) AS holder_3_name,
MAX(CASE WHEN row_id = 3 THEN address END) AS holder_3_address
FROM
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY license_plate ORDER BY some_date_field) AS row_id
FROM
holder_data
)
AS sorted_holder_data
如果您希望根據持有人的數量動態更改,則需要分幾個步驟進行。
1.運行查詢以找出最大持有人數
2.運行一些編寫SQL的代碼以多次重復MAX(CASE)
節
3.使用sp_executesql
運行由代碼編寫的sql
那是很多費力的工作,對吧? 必須有一種更好的SQL本機支持方式嗎?
你是對的。 從頭開始設計SQL,以通過使用規范化數據來實現其關系性質。 也就是說,從編程角度而不是從人類友好的表示角度考慮數據的結構。
方便地,您已經具有標准化結構中的數據。 因此,如果您想要真正的SQL處理方式, 請不要旋轉數據。
但是,介紹呢?
那不是SQL的目的。 SQL是一種數據存儲和處理語言。 它不是設計或打算用於演示。 您應該將設計的表示層與數據層分開 。 混合使用這兩種方法會導致各種維護問題。 這是一種錯誤的經濟做法,因為您嘗試堅持這種非規范化的思維方式的時間越長,使用SQL的難度就越大。 不要這樣做,讓您的SQL數據結構規范化,這就是SQL的目的。
取而代之的是,這種旋轉應在您的表示層中完成。 是Excel或SSRS還是QlikView或Tableau等等。 他們也了解規范化數據,並積極准備將規范化數據轉換為人類可呈現的格式。
編輯:
我剛剛讀到您在評論中寫道:
我對excel的管理不是很好,所以我在尋找是否有一種方法可以在導出后而不是在編輯xlsx表的過程中或之前進行。
那里有你的問題。 因為您對Excel不確定,所以您想使用SQL來為您做。 不幸的是,SQL是錯誤的地方,而Excel是正確的地方。 您需要學習如何在Excel中進行操作。
查看數據透視表,Power Pivot,VBA (適用於Visual Basic的應用程序)等。Excel有許多方法可以完成所需的工作,我強烈建議您學習如何使用正確的工具來完成工作,而不是笨拙做對您不利的錯誤工具。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.