2013-12-13 3 views
0

Я пытаюсь выяснить, как форматировать/группировать из таблицы в SQL Server 2008 R2. Я увлекся тем, как это сделать, но не смог найти способ сделать это. Вот основная схема таблицыT-SQL Построение столбцов с группы на

Pkey Account_No  Contact_Date Flag Job 
1  10001   2013-12-09  y  apple 
2  10001   2013-12-10  n  orange 
3  10002   2013-12-02  n  apple 
4  10003   2013-12-10  y  pear 
5  10003   2013-12-11  n  peach 
6  10003   2013-12-12  n  apple 

По существу то, что мне нужно, чтобы иметь выход как-то группа по ACCOUNT_NO (только отчетливый ACCOUNT_NO, перечисленные), но затем в contact_dates и флаги, построенные из них по заказу даты. Столбы для построения теоретически могли бы выходить навсегда. См. Таблицу ниже в качестве примера:

Account_No  Contact_Date_1 Flag_1 Job_1 Contact_Date_2 Flag_2 Job_2 Contact_Date_3 Flag_3 Job_3 
10001   2013-12-09  y  apple 2013-12-10  n  orange NULL    NULL  NULL 
10002   2013-12-02  n  apple NULL    NULL  NULL  NULL    NULL  NULL 
10003   2013-12-10  y  pear 2013-12-11  n  peach 2013-12-12  n  apple 

Благодарим за любую помощь заранее!

+1

Вы хотите, чтобы выход был специально? –

+1

И если account_no имеет 5 значений contact_date, вы хотите 5 наборов столбцов, а если у account_no есть 26 значений contact_date, вы хотите 26 наборов столбцов? Yikes (каламбур не предназначен). Оставьте это поворотным для уровня представления. –

ответ

0

Хороший вопрос здесь. Я часто сталкиваюсь с подобными проблемами при кодировании отчетов.

я сделать что-то вроде this-

WITH y AS (
SELECT row_number() over (partition by account_no order by contact_date) AS rn, 
     pkey 
     , account_no 
     , contact_date 
     , flag 
     , job 
    FROM x -- assuming the name of your table is x 
) 
    SELECT account_no, 
     MAX(CASE WHEN rn = 1 THEN contact_date ELSE NULL END) AS contact_date_1, 
     MAX(CASE WHEN rn = 1 THEN flag ELSE NULL END) AS flag_1, 
     MAX(CASE WHEN rn = 1 THEN job ELSE NULL END) AS job_1, 
     MAX(CASE WHEN rn = 2 THEN contact_date ELSE NULL END) AS contact_date_2, 
     MAX(CASE WHEN rn = 2 THEN flag ELSE NULL END) AS flag_2, 
     MAX(CASE WHEN rn = 2 THEN job ELSE NULL END) AS job_2, 
     MAX(CASE WHEN rn = 3 THEN contact_date ELSE NULL END) AS contact_date_3, 
     MAX(CASE WHEN rn = 3 THEN flag ELSE NULL END) AS flag_3, 
     MAX(CASE WHEN rn = 3 THEN job ELSE NULL END) AS job_3 
    FROM y 
GROUP BY account_no 

Там может быть короче решение, но не может думать об этом прямо сейчас.

Но будьте осторожны - это будет работать только для трех значений contact_date. Для любых других значений вам нужно будет добавить еще один набор столбцов MAX(.. в списке SELECT.

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