2012-02-16 4 views
2

У меня есть данные отчета в том, что структурированное как следует:Переупорядочивание данные в TSQL

RecID | ReportView1   | Name | Value | Total 
1  | CURRENT_VIEW   | 'Test1' | 10 | 20 
1  | PROPOSED_VIEW   | 'Test11'| 20 | 30 
1  | POTENTIAL_SAVING_VIEW | null | null | 80 
2  | CURRENT_VIEW   | 'Test1' | 10 | 20 
2  | PROPOSED_VIEW   | 'Test22'| 25 | 35 
2  | POTENTIAL_SAVING_VIEW | null | null | 70 
3  | CURRENT_VIEW   | 'Test1' | 10 | 20 
3  | PROPOSED_VIEW   | 'Test33'| 45 | 65 
3  | POTENTIAL_SAVING_VIEW | null | null | 90 

Я хочу, чтобы изменить порядок на основе TOTAL DECS, но применяются только для ReportView1 = «POTENTIAL_SAVING_VIEW»

Так что данные будут быть:

NewRecID | RecID | ReportView1   | Name  | Value | Total 
1  | 3  | CURRENT_VIEW   | 'Test1' | 10 | 20 
1  | 3  | PROPOSED_VIEW   | 'Test33' | 45 | 65 
1  | 3  | POTENTIAL_SAVING_VIEW | null  | null | 90 
2  | 1  | CURRENT_VIEW   | 'Test1' | 10 | 20 
2  | 1  | PROPOSED_VIEW   | 'Test11' | 20 | 30 
2  | 1  | POTENTIAL_SAVING_VIEW | null  | null | 80 
3  | 2  | CURRENT_VIEW   | 'Test1' | 10 | 20 
3  | 2  | PROPOSED_VIEW   | 'Test22' | 25 | 35 
3  | 2  | POTENTIAL_SAVING_VIEW | null  | null | 70 

Я мог бы, вероятно, использовать присоединение withiin себя, но я просто интересно, может быть, есть альтернатива.

Благодаря

ответ

3

(Под редакцией t о случаях приходится с повторяющимися суммами)

; 
WITH atable (RecID , ReportView1 , Name , Value , Total) AS (
    SELECT 1, 'CURRENT_VIEW   ', 'Test1' , 10 , 20 UNION ALL 
    SELECT 1, 'PROPOSED_VIEW  ', 'Test11', 20 , 30 UNION ALL 
    SELECT 1, 'POTENTIAL_SAVING_VIEW', null , null , 80 UNION ALL 
    SELECT 2, 'CURRENT_VIEW   ', 'Test1' , 10 , 20 UNION ALL 
    SELECT 2, 'PROPOSED_VIEW  ', 'Test22', 25 , 35 UNION ALL 
    SELECT 2, 'POTENTIAL_SAVING_VIEW', null , null , 70 UNION ALL 
    SELECT 3, 'CURRENT_VIEW   ', 'Test1' , 10 , 20 UNION ALL 
    SELECT 3, 'PROPOSED_VIEW  ', 'Test33', 45 , 65 UNION ALL 
    SELECT 3, 'POTENTIAL_SAVING_VIEW', null , null , 90 UNION ALL 
    SELECT 4, 'CURRENT_VIEW   ', 'Test1' , 10 , 20 UNION ALL 
    SELECT 4, 'PROPOSED_VIEW  ', 'Test11', 20 , 30 UNION ALL 
    SELECT 4, 'POTENTIAL_SAVING_VIEW', null , null , 80 
), 
ranked AS (
    SELECT 
    *, 
    rnk = MAX(CASE ReportView1 WHEN 'POTENTIAL_SAVING_VIEW' THEN Total END) 
      OVER (PARTITION BY RecID) 
    FROM atable 
) 
SELECT 
    NewRecID = DENSE_RANK() OVER (ORDER BY rnk DESC, RecID), 
    RecID, 
    ReportView1, 
    Name, 
    Value, 
    Total 
FROM ranked 
ORDER BY 
    rnk DESC, 
    RecID, 
    Total 

Выход:.

NewRecID RecID ReportView1   Name Value Total 
-------- ----- --------------------- ------ ----- ----- 
1   3  CURRENT_VIEW   Test1 10  20 
1   3  PROPOSED_VIEW   Test33 45  65 
1   3  POTENTIAL_SAVING_VIEW NULL NULL 90 
2   1  CURRENT_VIEW   Test1 10  20 
2   1  PROPOSED_VIEW   Test11 20  30 
2   1  POTENTIAL_SAVING_VIEW NULL NULL 80 
3   4  CURRENT_VIEW   Test1 10  20 
3   4  PROPOSED_VIEW   Test11 20  30 
3   4  POTENTIAL_SAVING_VIEW NULL NULL 80 
4   2  CURRENT_VIEW   Test1 10  20 
4   2  PROPOSED_VIEW   Test22 25  35 
4   2  POTENTIAL_SAVING_VIEW NULL NULL 70 
+0

+1 Я предпочитаю эти решения без использования объединений. Это было бы более или менее одинаковым решением, которое я бы придумал. –

+0

Привет там ... Я обнаружил некоторую аномалию, если общее значение для каждого POTENTIAL_SAVING_VIEW одинаково, что вызывает проблему. Можем ли мы добавить еще один RecID в качестве другого вида. – dcpartners

+0

@ dcalliances: Да, добавив 'RecID' к основному предложению SELECT' ORDER BY' (между 'rnk DESC' и' Total'), а также к предложению 'ORDER BY' функции ранжирования (после' rnk DESC'), похоже, устраняет проблему. (Обновлен мой ответ.) –

1

Дайте это попробовать:

with OrderedTable as (
    select recid, total orderedTotal from t1 
    where reportview1 = 'POTENTIAL_SAVING_VIEW' 
) 
select t1.* from OrderedTable o 
join t1 on o.recid = t1.recid 
order by o.orderedTotal desc, t1.total 

Или без КТРА:

select t1.* from (
    select recid, total orderedTotal from t1 
    where reportview1 = 'POTENTIAL_SAVING_VIEW' 
) o 
join t1 on o.recid = t1.recid 
order by o.orderedTotal desc, t1.total 

Примечания каждой группы Recs заказывается по общему ASC, которая, как я думаю, вы (на основании приведенного примера)

+0

хорошо, но вы не хотите, чтобы добавить что-то, чтобы контролировать порядок в каждой группе, так что идет «ток/планируемым/потенциал «... для полноты? –

+0

Хорошая точка! Просто добавлен подзадачный итог, который, по-видимому, является столбцом, на котором упорядочивается группа заявок. –

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