[英]SQL query to get multiple records into multiple columns
我有一個 CSV,我正在嘗試為其創建和提取數據。 CSV 模板有多個狀態列(即:Status1、Status2、Status3)。 有些位置只有一個狀態,有些最多可以有 3 個。我試圖在 SQL 中找到一種方法,我可以有 3 個狀態列,並根據一個位置的記錄數填充這些列。 例如,名為 John's Office 的位置可能具有就緒狀態。 另一個名為 IT Workroom 的位置可能有 3 種狀態,Ready、In-Repair 和 In-Use。 SQL 查詢中的列如下所示:
Location Status1 Status2 Status3
----------------------------------------------------------
John's Office Ready
IT Workroom Ready In-Repair In-Use
列名 Status1、Status2 等將是剛剛組成的列名。 我想用返回的第一條記錄填充 Status1,而不考慮實際的狀態名稱。 因此 Status1 將始終被填充。 Status2 只有在它們是第二狀態時才會被填充。
在包含此信息的原始表中,它看起來像這樣:
LocationName StatusName
------------------------------------
IT Workroom In-Repair
IT Workroom Ready
John's Office Ready
IT Workroom In-Use
我試過PIVOT
,但我意識到這不是我需要的,因為我沒有在技術上聚合數據。
你可以像這樣使用最大大小寫的行號:
select LocationName, MAX(CASE WHEN RowNum = 1 THEN StatusName ELSE NULL END) Status1
, MAX(CASE WHEN RowNum = 2 THEN StatusName ELSE NULL END) Status2
, MAX(CASE WHEN RowNum = 3 THEN StatusName ELSE NULL END) Status3
from (
select *, ROW_NUMBER() OVER (PARTITION BY LocationName ORDER BY LocationName, StatusName) RowNum
from #data
) Recs
group by LocationName
請嘗試以下解決方案模仿 PIVOT 操作。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, LocationName VARCHAR(30), StatusName VARCHAR(50));
INSERT INTO @tbl VALUES
('IT Workroom', 'In-Repair'),
('IT Workroom', 'Ready'),
('John''s Office', 'Ready'),
('IT Workroom', 'In-Use');
-- DDL and sample data population, end
SELECT LocationName
, MAX(CASE WHEN StatusName = 'Ready' THEN StatusName ELSE '' END) [Status1]
, MAX(CASE WHEN StatusName = 'In-Repair' THEN StatusName ELSE '' END) [Status2]
, MAX(CASE WHEN StatusName = 'In-Use' THEN StatusName ELSE '' END) [Status3]
FROM @tbl
GROUP BY LocationName
ORDER BY LocationName;
Output
+---------------+---------+-----------+---------+
| LocationName | Status1 | Status2 | Status3 |
+---------------+---------+-----------+---------+
| IT Workroom | Ready | In-Repair | In-Use |
| John's Office | Ready | | |
+---------------+---------+-----------+---------+
這是一個非常簡單的解決方案,考慮到您只有 3 種不同類型的狀態,因此代碼不會被復制太多。
insert into new_locations (
select distinct location,
case when location in (select distinct location from old_locations where status = 'ready') then 'ready' else '' end,
case when location in (select distinct location from old_locations where status = 'active') then 'active' else '' end,
case when location in (select distinct location from old_locations where status = 'dead') then 'dead' else '' end
from old_locations
);
SQL 非常方便,這只是您可以通過使用一些代碼復制來作弊的情況,它非常容易理解並發揮作用。 對於此類問題,通常有一些純粹的 SQL 解決方案,無需使用 T-SQL 或其他 sql “升級”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.