2014-10-15 4 views
1

У меня есть следующие данные:SQL запрос, чтобы разделить данные на основе значения столбца

SR_ID OPEN_DATE OPEN_WEEK PRIORITY TTRespond 
------- ----------- ----------- ----------- ------------- 
24720 01/10/2014 40   P2 - High 3.867066667 
24437 11/09/2014 37   P2 - High 418.1992333 
24007 04/08/2014 32   P1 - Urgent 12571.28308 
24628 25/09/2014 39   P2 - High 3.0407 
24446 12/09/2014 37   P2 - High 2694.122933 
24420 10/09/2014 37   P3 - Normal 
24479 15/09/2014 38   P2 - High 90.56748333 
24924 15/10/2014 42   P3 - Normal 26.51546667 
24706 01/10/2014 40   P2 - High 

Я пытаюсь написать запрос, который будет возвращать данные в последнем столбце (TTRespond) в отдельных колонках на основе значение в OPEN_WEEK и ПРИОРИТЕТ.

Я хотел бы вернуть данные, как это:

Priority P1 - Urgent P1 - Urgent P1 - Urgent P1 - Urgent P1 - Urgent P1 - Urgent 
----------- ----------- ----------- ----------- ----------- ----------- ----------- 
Week #  31   32   33   34   35   36 

Я не хочу, чтобы суммировать данные (то есть граф Средний и т.д.), я просто хочу, чтобы вернуть все строки, которые соответствуют двум критериям. Я достиг результата с использованием формулы на основе массива в Excel, но он очень медленный и не может справиться с набором исходных записей (всего 25 000 строк).

Любая помощь будет принята с благодарностью.

Thanks

+2

Добро пожаловать в Stackoverflow! Похоже, у вас есть большой вопрос, заваривающий там ... однако, я думаю, вам нужно добавить немного более подробную информацию о том, что именно ожидаемое поведение (что означает «Срочная неделя № 31 32 33 34 35 36»)? , Как, может быть, создать желаемый результат в аналогичной форме для ваших исходных данных? –

+3

Вы упомянули «вернуть данные в последнем столбце (TTRespond)», но в данных, которые вы хотите вернуть, вы не упомянули «TTRespond'. Есть ли причина, по которой вы не показываете это? Не могли бы вы объяснить это? – Ram

+0

Однако я читаю ваш вопрос. Я не понимаю, что именно вы хотите. С одной стороны, это похоже на то, что вам просто нужно предложение WHERE-типа «WHERE OPEN_WEEK = @openWeekParam AND PRIORITY = @priorityParam», а с другой стороны, похоже, что вы просто хотите что-то вроде «GROUP BY OPEN_WEEK, PRIORITY». Поэтому, пожалуйста, объясните немного больше, что вы хотите. Вы упомянули, что хотите TTRespons, но в вашем ответе-примере TTRespons не существует. – Sasse

ответ

1

Не совсем понятно, что вы просите. Но предположим, что вы ищете выходной-то вроде этого, где приоритет/номер недели являются столбцы, и все возможные значения сопоставления приведены в строках:

P2 - High, Week 37 | P2 - High, Week 38 | P2 - High, Week 39 | P2 - High, Week 40 
--------------------------------------------------------------------------------- 
418.1992333  | 90.56748333  | 3.0407    | 3.867066667 
2694.122933  |     |     | 

Этот вид «строки/столбца инверсии» называется сводной таблицей. Простые сводные таблицы могут быть сделаны с умным использованием group by и max положений в следующем виде в SQL Server:

;with T as (
    select 
     row_number() over (partition by priority, open_week order by open_date) ix 
     ,T.* 
    from MyTable T 
    where TTrespond is not null 
), R as (
    select distinct ix from T 
) 
select 
    R.ix 
    ,max(case when [OPEN_WEEK]=37 and T.ix=R.ix and [PRIORITY]='P2 - High' then TTRespond end) as [P2 - High, Week 37] 
    ,max(case when [OPEN_WEEK]=38 and T.ix=R.ix and [PRIORITY]='P2 - High' then TTRespond end) as [P2 - High, Week 38] 
    ,max(case when [OPEN_WEEK]=39 and T.ix=R.ix and [PRIORITY]='P2 - High' then TTRespond end) as [P2 - High, Week 39] 
    ,max(case when [OPEN_WEEK]=40 and T.ix=R.ix and [PRIORITY]='P2 - High' then TTRespond end) as [P2 - High, Week 40] 
from T, R 
group by R.ix 

Возможные значения могут быть расширены путем добавления дополнительных комбинаций столбцов по образцу приведенных выше примеров.

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