2012-02-16 50 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 

我想基于总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我更喜欢这些解决方案,而不使用连接。这或多或少都是我想出的相同解决方案。 – 2012-02-16 08:34:03

+0

嗨那里...我发现一些异常,如果每个POTENTIAL_SAVING_VIEW的总数是相同的,它导致一个问题。我们可以把一些额外的RecID作为另一种类型。 – dcpartners 2012-02-17 05:57:24

+0

@dcalliances:是的,向主SELECT的ORDER BY子句(在'rnk DESC'和'Total'之间)以及排名函数的ORDER BY'子句中添加'RecID'(在'rnk DESC之后' )似乎解决了这个问题。 (更新了我的答案。) – 2012-02-17 06:20:22

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 

或者不CTE:

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 

注意每组的地区经济共同体是由总ASC排序,这是我想你希望他们显示(基于提供的示例)

+0

不错,但你不希望如此这般“添加的东西给每个组内控制排序当前/提议/潜力“...为了完整? – 2012-02-16 06:41:45

+0

好点!刚刚添加了一个子订单,这似乎是订购recids组的一个列。 – 2012-02-16 06:47:06