重新排序 TSQL 中的数据 [英] Reordering the data in TSQL

查看:27
本文介绍了重新排序 TSQL 中的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的报告数据结构如下:

I have report data is that structured as followed:

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'

I want to reorder based on TOTAL DECS but only apply for 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

我可能会在内部使用加入,但我只是想知道可能有替代方法.

I could probably use joining withiin itself BUT I am just wondering it may be there is an alternative.

谢谢

推荐答案

(已编辑以解决重复总数的情况.)

;
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

这篇关于重新排序 TSQL 中的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆