2013-12-22 2 views
0

Не могли бы вы помочь мне с этим проектом? Я изучил ранее заданные вопросы, но они, похоже, не рассматривают эту уникальную ситуацию.Эффективное распределение столбцов на строки

Образец данных:

Member | DOS | Dx1 | Dx2 | Dx3 | Dx4 | Dx5 
12345 | 1/1/2011 | 12142 | 12345 | 65657 | 5657 | 568 
56484 | 3/5/2011 | 568 | 56785 | 5695 | 575 | 168 
56872 | 2/12/2011 | 567 | 567 | 

Что мне нужно, чтобы увидеть это:

Member DOS DX Seq 
12345 1/1/2011 12142 Dx1 
12345 1/1/2011 12345 Dx2 
12345 1/1/2011 65657 Dx3 

и так далее. Показывая только те Dx, где не null-so для 56872, мы видели только Dx1 и Dx2, но для остальных 2 мы увидели записи для всех 5 Dx.

Может ли кто-нибудь мне помочь? Спасибо.

+0

Это не очень хорошо проявилось. Мои данные текущие, где Dx1, Dx2 и т. Д. Являются столбцами - мне нужны они, чтобы быть строками, а Seq говорит мне, какой Dx # это. Спасибо. – user3127999

+0

@TastySpaceApple: почему тег mongodb? –

+0

Итак, это 3 документа monngo, которые вы хотите конвертировать, в этом случае 12? используют какой-либо конкретный язык? или это консоль монго? – xcorat

ответ

0

Этот тип преобразования данных называется UNPIVOT. К сожалению, у MySQL нет функции univot, но вы можете реплицировать функциональность несколькими различными способами.

Вы можете использовать UNION ALL запрос для преобразования значения каждого столбца в строки:

select member, dos, dx, seq 
from 
(
    select member, dos, dx1 as dx, 'Dx1' as seq 
    from yourtable 
    union all 
    select member, dos, dx2 as dx, 'Dx2' as seq 
    from yourtable 
    union all 
    select member, dos, dx3 as dx, 'Dx3' as seq 
    from yourtable 
    union all 
    select member, dos, dx4 as dx, 'Dx4' as seq 
    from yourtable 
    union all 
    select member, dos, dx5 as dx, 'Dx5' as seq 
    from yourtable 
) d 
where dx is not null 
order by member, seq; 

См SQL Fiddle with Demo. Этот метод даст вам результат, но он может быть не очень эффективным для больших таблиц.

Другой метод будет использовать Перекрестное соединение на виртуальной таблице:

select member, dos, dx, seq 
from 
(
    select t.member, t.dos, 
    case s.seq 
     when 'Dx1' then dx1 
     when 'Dx2' then dx2 
     when 'Dx3' then dx3 
     when 'Dx4' then dx4 
     when 'Dx5' then dx5 
    end DX, 
    s.seq 
    from yourtable t 
    cross join 
    (
    select 'Dx1' as seq union all 
    select 'Dx2' as seq union all 
    select 'Dx3' as seq union all 
    select 'Dx4' as seq union all 
    select 'Dx5' as seq 
) s 
) d 
where dx is not null 
order by member, seq; 

См SQL Fiddle with Demo. Оба дают результат:

| MEMBER |        DOS | DX | SEQ | 
|--------|---------------------------------|-------|-----| 
| 12345 | January, 01 2011 00:00:00+0000 | 12142 | Dx1 | 
| 12345 | January, 01 2011 00:00:00+0000 | 12345 | Dx2 | 
| 12345 | January, 01 2011 00:00:00+0000 | 65657 | Dx3 | 
| 12345 | January, 01 2011 00:00:00+0000 | 5657 | Dx4 | 
| 12345 | January, 01 2011 00:00:00+0000 | 568 | Dx5 | 
Смежные вопросы