【问题标题】:Reordering the data in TSQL在 SQL 中重新排序数据
【发布时间】:2012-02-17 14:17:35
【问题描述】:

我的报告数据结构如下:

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

我可能会使用加入本身,但我只是想知道它可能有替代方案。

谢谢

【问题讨论】:

    标签: tsql


    【解决方案1】:

    (已编辑以考虑总数重复的案例。)

    ;
    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
    

    【讨论】:

    • +1 我更喜欢这些不使用连接的解决方案。这或多或少与我想出的解决方案相同。
    • 您好...我发现了一些异常情况,如果每个 POTENTIAL_SAVING_VIEW 的总数相同,则会导致问题。我们可以把一些额外的 RecID 作为另一种类型。
    • @dcalliances: 是的,将RecID 添加到主SELECT 的ORDER BY 子句(在rnk DESCTotal 之间)以及排名函数的ORDER BY 子句(之后rnk DESC) 似乎解决了这个问题。 (更新了我的答案。)
    【解决方案2】:

    试试这个:

    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
    

    请注意,每组 Recs 都按总 ASC 排序,我猜这就是您希望它们显示的方式(基于提供的示例)

    【讨论】:

    • 很好,但您不想添加一些东西来控制每个组内的排序,使其变为“当前/建议/潜在”...为了完整性?
    • 好点!刚刚在 total 上添加了一个子订单,这似乎是对 recids 组进行排序的列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2019-11-01
    • 1970-01-01
    • 2023-02-03
    相关资源
    最近更新 更多