2010-08-02 5 views
3

Я использую SQLServer2008 Экспресс
У меня есть таблица и скрипт для преобразования строки в столбцы с ожидаемым результатом, каксводной таблицы строка в колонку

PARENT_ID name01 name02 name03 name04 
1   ABC  DEF  ABC2 DEF2 
2   DEF3 null null null 

Однако, я получаю результат как

PARENT_ID name01 name02 name03 name04 
1   ABC  DEF  ABC2  DEF2 
2   null  null  null  null 

Я знаю, что с кодом что-то не так, просто я не могу понять. Надеюсь, кто-то может помочь.

CREATE TABLE #temp (
    parent_id   bigint NOT NULL 
    ,dependent_id  bigint not null 
    ,date_of_birth  date not null 
    ,last_name   varchar(100) 
    ,first_name   varchar(100) 
    ,effective_start_date date 
    ,effective_end_Date date 
) 
insert into #temp values (1,1,'1990-10-01','ABC',null,'1989-01-01','9999-12-31') 
insert into #temp values (1,2,'1991-06-02','DEF',null,'1989-01-01','9999-12-31') 
insert into #temp values (1,3,'1992-06-02','ABC2',null,'1989-01-01','9999-12-31') 
insert into #temp values (1,4,'1993-06-02','DEF2',null,'1989-01-01','9999-12-31') 
insert into #temp values (2,5,'2000-06-02','DEF3',null,'1989-01-01','9999-12-31') 

SELECT PARENT_ID 
    ,[1] as name01 
    ,[2] as name02 
    ,[3] as name03 
    ,[4] as name04 
FROM (SELECT top(100) percent 
    PARENT_ID 
    , dependent_id 
    , (isnull(first_name,'')+last_name) as fullname 
FROM #temp 
where GETDATE() between effective_start_date and effective_end_Date 
order by date_of_birth 
    ) AS piv 
PIVOT (max(fullname) 
    FOR dependent_id IN ([1], [2], [3], [4]) 
) AS chld 

Благодаря Elmer

+0

+1 Для обеспечения полезной DDL с вашим вопросом. –

ответ

2

Что-то не так с данными, а не код, который я думаю. Вы вставляете 5 в качестве dependent_id, но ожидаете, что он появится в столбце 1?

Возможно, вы можете использовать dependent_id % 4, но я не совсем уверен, что это за намерение?

Редактировать Следуя вашему комментарию, я думаю, вам это нужно?

SELECT PARENT_ID 
    ,[1] as name01 
    ,[2] as name02 
    ,[3] as name03 
    ,[4] as name04 
FROM 
(
    SELECT 
    PARENT_ID, 
    ROW_NUMBER() OVER (PARTITION BY PARENT_ID ORDER BY date_of_birth) AS RN 
    , (isnull(first_name,'')+last_name) as fullname 
FROM #temp 
where GETDATE() between effective_start_date and effective_end_Date 
) AS piv 
PIVOT (max(fullname) 
    FOR RN IN ([1], [2], [3], [4]) 
) AS chld 
+0

Hi Martin, Таблица состоит из максимум четырех строк для данного родительского_ид. И все 4 строки должны стать 4 столбцами. Элемент parent_id последней инструкции вставки отличается от инструкции parent insert 1-го 4. Спасибо, Elmer – Elmer

+0

Hi again Martin, Что это такое% 4? Это% 4 работал. С уважением, Elmer – Elmer

+0

@Elmer После вашего уточнения я не думаю, что вам нужно '% 4' (это оператор modulo). Я думаю, вам нужно использовать 'ROW_NUMBER', чтобы редактировать. –

Смежные вопросы