2013-06-21 6 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

'존'이 '월요일'등과 연결되는 것을 어떻게 알 수 있습니까? 테이블에 나열된 방식 때문입니까? 테이블의 데이터는 본질적으로 정렬되지 않습니다. 데이터를이 순서로 유지할 수있는 열 (ID 열)이 있습니까? – Taryn

+0

예, 텍스트 파일 목록에서 가져 왔습니다. 그래서 월요일 아래의 모든 사람들은 월요일이고 화요일 아래의 모든 사람들은 화요일입니다. 내가 한 줄씩 순서대로 데이터를 가져 왔다고 가정하면 늘릴 수있는 ID 열과 증분 할 수 있습니다. – pugu

+1

개인적으로, 매주 두 번째 테이블을 만들고, 모든 레코드에서 하루의 이름을 반복하는 대신, 기술 키를 제공하고, FK와 연결합니다. –

답변

4

당신은 소스에 해당 ID 열을 추가 할 수있을거야 가정 주문을위한 테이블과 당신의 테이블은 어떤 모습으로 보일 것입니다. 이 같은 NG는 :

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

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

는 당신이 시도 할 수있는 사항은 다음과 같습니다 당신이 그들을 구별 할 수 있도록

  • 먼저 는
  • 가입 일 (다른 방법으로 수행 할 수 있습니다) 평일 임시 테이블을 만들 다시 원래 테이블에 큰 ID를 찾고 (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

내가 원하는 것은 분명히 우리가 다양한 날에 다양한 수의 사람들을 가지고있는 경우에만 문제가되고 싶다는 것이다. 따라서 '월요일'에 대한 목록에 '마이크'를 추가하면 중단됩니다. 나는이 경우 아마 루프를하고 각 섹션에있는 사람들의 수를 세는 것이 필요할 것이라고 생각합니다. – pugu

관련 문제