2013-06-21 25 views
3

我在SQL Sever中有一列數據,需要將其擴展爲多個(2)列。在SQL Server中將單個列轉換爲多個

的原始數據看起來像這樣:

Col1 
------- 
Monday 
Jon 
Boris 
Natalie 
Tuesday 
James 
Tom 
Boris 

我想它看起來就像這樣:

Name | Day 
-------+--------- 
Jon | Monday 
Boris | Monday 
Natalie| Monday 
James | Tuesday 
Tom | Tuesday 
Boris | Tuesday 

提前非常感謝。

+3

你怎麼知道'Jon'被綁定到'Monday'等等?這是由於他們在表格中列出的方式嗎?表中的數據並非固有排序,您是否有一列將按照此順序保存數據 - 一個標識列? – Taryn

+0

是的,它從文本文件列表中導入。所以週一下的每個人都是星期一,週二下的每個人都是星期二。假設我按順序逐行導入數據,我可以使用一個增量的ID列。 – pugu

+1

就我個人而言,我會創建第二張表,並在每週的日子裏給他們一個技術密鑰,並將他們與FK鏈接起來,而不是在每個記錄中重複一天的名字。 –

回答

4

假設你將能夠在該標識列添加到源代碼訂餐桌,你的桌子會看起來有些東西納克這樣的:

CREATE TABLE Table1 (id int identity(1,1), Col1 NVARCHAR(50)) 

INSERT INTO Table1 (Col1) 
VALUES 
    ('Monday'),('Jon'),('Boris'),('Natalie'), 
    ('Tuesday'),('James'),('Tom'),('Boris') 

你可以嘗試以下方法:

  • 首先創建一個臨時表平日這樣你就可以區分它們 (也可以用其他方式來完成)
  • 加入天(t.ID> d1.ID)
  • 防止那些應該在第二天進入ID(t.ID < MIN(d2.Id))
  • 合併只是爲了確保它在列表中的最後一天有效。

CREATE TABLE #weekDays (wd NVARCHAR(10)); 

INSERT INTO #weekDays 
VALUES 
    ('Monday'), ('Tuesday'), ('Wednesday'), 
    ('Thursday'), ('Friday'), ('Saturday'), ('Sunday'); 

WITH CTE_Days AS 
(
    SELECT t.* 
    FROM Table1 t 
    INNER JOIN #weekDays wd ON wd.wd = t.col1 
) 
SELECT * 
FROM CTE_Days d1 
INNER JOIN Table1 t ON t.id > d1.id AND t.id < 
    COALESCE((
     SELECT MIN(d2.id) 
     FROM CTE_Days d2 
     WHERE d2.id > d1.id 
    ), t.id + 1) 
+2

+1 - 有趣的答案。 – Devart

+1

這是一個很好的答案,非常感謝你!我有相當長的例程建立涉及變量和while循環。這太可怕了! – pugu

2

嘗試這一個 -

查詢:

DECLARE @temp TABLE (Col1 NVARCHAR(50)) 

INSERT INTO @temp (Col1) 
VALUES 
    ('Monday'),('Jon'),('Boris'),('Natalie'), 
    ('Tuesday'),('James'),('Tom'),('Boris') 

;WITH cte AS 
(
    SELECT 
      Col1 
     , rn = ROW_NUMBER() OVER (ORDER BY 1/0) % 4 
     , rn2 = ROW_NUMBER() OVER (ORDER BY 1/0) 
    FROM @temp 
) 
SELECT 
     [Day] = t.Col1 
    , Name = t2.Col1 
FROM cte t 
OUTER APPLY (
    SELECT * 
    FROM cte t2 
    WHERE t2.rn2 BETWEEN t.rn2 + 1 AND t.rn2 + 3 
) t2 
WHERE t.rn = 1 

輸出:

output

+0

這當然做我想要的唯一的問題是,如果我們有不同數量的人在不同的日子。因此,如果我們在'星期一'列表中添加'Mike',它就會中斷。我想在這種情況下,我可能需要做一個循環,並計算每個部分的人數。 – pugu

相關問題