簡體   English   中英

SQL查詢獲取多條記錄到多列

[英]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.

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