【问题标题】:MS SQL sorting records using values fetch by unionMS SQL 使用联合获取的值对记录进行排序
【发布时间】:2018-08-14 07:43:40
【问题描述】:

我有一个记录表,其中包含 MS SQL 中的值,例如

ID, Type, Name, Amount 
----------------------
1, 1, abc, 100
2, 1, xyz, 200
3, 1, aaa, 500
null, 1, 'Total', 800
4, 2, bbb, 100
5, 2, bbc, 200
6, 2, bbx, 400
null, 2, 'Total', 700
7, 4, ccc, 400
8, 4, cde, 200
9, 4, fgh, 400
null, 4, 'Total', 1000

现在我想对这些值进行排序,比如 1000 应该排在第一位,800 排在第二位,并且 id 4 的所有行也应该排在其他记录之前。

我的查询是:

从表中选择 ID、类型、名称、金额 联合所有 select null, Type, 'Total', sum(Amount) from Table group by Type

【问题讨论】:

  • 你有没有尝试过?
  • 提示:ORDER BY Amount DESC
  • 我做了:从表联合中选择 Id、类型、名称金额全部从表组中选择 null、类型、“总计”、总和(金额)按金额按金额排序。但它不会将最大数量的记录放在首位。

标签: sql sql-server sql-server-2012


【解决方案1】:

你的order by中有两个条件

  1. id 4 也应该排在其他记录之前。
  2. 我想对这些值进行排序,比如 1000 应该排在第一位,800 排在第二位

你可以尝试使用CASE WHEN和多个order by

CREATE TABLE T(
    ID INT,
    Type INT,
    Name VARCHAR(50),
    Amount INT
);

INSERT INTO T VALUES (1, 1, 'abc', 100        );
INSERT INTO T VALUES (2, 1, 'xyz', 200        );
INSERT INTO T VALUES (3, 1, 'aaa', 500        );
INSERT INTO T VALUES (null, 1, 'Total', 800 );
INSERT INTO T VALUES (4, 2, 'bbb', 100        );
INSERT INTO T VALUES (5, 2, 'bbc', 200        );
INSERT INTO T VALUES (6, 2, 'bbx', 400        );
INSERT INTO T VALUES (null, 2, 'Total', 700 );
INSERT INTO T VALUES (7, 4, 'ccc', 400        );
INSERT INTO T VALUES (8, 4, 'cde', 200        );
INSERT INTO T VALUES (9, 4, 'fgh', 400        );
INSERT INTO T VALUES (null, 4, 'Total', 1000);

查询 1

SELECT * 
FROM T
ORDER BY 
(CASE WHEN ID = 4 THEN 0 ELSE 1 END),
Amount DESC

Results

|     ID | Type |  Name | Amount |
|--------|------|-------|--------|
|      4 |    2 |   bbb |    100 |
| (null) |    4 | Total |   1000 |
| (null) |    1 | Total |    800 |
| (null) |    2 | Total |    700 |
|      3 |    1 |   aaa |    500 |
|      9 |    4 |   fgh |    400 |
|      7 |    4 |   ccc |    400 |
|      6 |    2 |   bbx |    400 |
|      5 |    2 |   bbc |    200 |
|      8 |    4 |   cde |    200 |
|      2 |    1 |   xyz |    200 |
|      1 |    1 |   abc |    100 |

【讨论】:

    【解决方案2】:
    SELECT [ID]
          ,[Type]
          ,[Name]
          ,[Amount]
      FROM [T]
      Group by [Type],[Amount],[Name],[ID]
      Order by [Type] desc, [Amount] desc
    

    这是我的结果。我认为您的意思是按类型而不是 ID 排序

    ID  Type    Name    Amount
    NULL    4   Total   1000
    7   4   ccc 400
    9   4   fgh 400
    8   4   cde 200
    NULL    2   Total   700
    6   2   bbx 400
    5   2   bbc 200
    4   2   bbb 100
    NULL    1   Total   800
    3   1   aaa 500
    2   1   xyz 200
    1   1   abc 100
    

    【讨论】:

    • 在上面的结果中,现在我希望 800 及其类型排在第二位,700 排在第三位。
    • 试试Order by [Amount] desc, type。我不确定,它是对还是错。
    【解决方案3】:

    如果我理解正确,您希望按总量最大的类型对行进行排序。您可以使用窗口函数:

    order by max(case when name = 'Total' then amount end) over (partition by type) desc,  -- put the types with the largest totals first
             type,  -- keep all types together
             id desc    -- canonically order within each type
    

    【讨论】:

      【解决方案4】:

      我会使用窗口函数:

      order by max(amount) over (partition by type) desc,
               amount desc,
               id;
      

      【讨论】:

        猜你喜欢
        • 2021-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-25
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多