【问题标题】:Ascending & descending in single query with Aggregate & Partition使用聚合和分区在单个查询中升序和降序
【发布时间】:2016-03-02 19:39:53
【问题描述】:

我有如下所示的数据:

name  SAL1 SAL2 SAL3
A     10  20   30
B     11  21   31
C     12  22   32
D     13  23   33

我试图获得一个额外的计算列,即 10 / 25 *100
[ SAL1 of A / Sum( TOP 2 Sal1 ORDER BY Sal1 DESC ) ] 而不是考虑分母中所有记录的总和,我只需要考虑sal desc的前2个sal订单

分别用于其余行。 随后与其他列。

name SAL_calculated
A 40
B 44
C 48
D 52

对名称列按 Asc 排序,对其余列按 Desc 排序

【问题讨论】:

  • 您使用的 SQL Server 版本是什么?
  • 这是 SQL Server 2012
  • 我不需要考虑分母中所有记录的总和,我只需要考虑前 2 个按 sal desc 排序的 sal 订单,即 10 / 25 *100 NOT 10 /46 *100 抱歉更改,即 A = 40 不是 21.7
  • 已经更新了我的答案。请尝试

标签: sql sql-server


【解决方案1】:
SELECT name, SAL_calculated = SAL * 100.0 / SUM(SAL) OVER ()
FROM   table
ORDER BY name ASC, SAL_calculated DESC

A 的 SAL1 / Sum(TOP 2 Sal1 ORDER BY Sal1 DESC)

select  *, t.SAL1 * 100.0 / c.TOP2_SAL
from    tbl t
    CROSS APPLY
    (
        SELECT TOP2_SAL = SUM(SAL1)
        FROM
        (
            SELECT TOP 2 SAL1
            FROM    tbl
            ORDER BY SAL1 desc
        ) c
    ) c

【讨论】:

  • SELECT name, SAL_calculated = 100.0 * SAL / SUM(SAL) OVER () 记住 SQL Server 整数除法Demo 否则你会得到零。
  • 用户不需要每列计算总和
  • 获取一个额外的计算列,即 10 / 46 *100..for each column ?
  • 松鼠和小伙子 2025 感谢您的支持。但是请稍等一下,您可以再次检查要求吗?我已经进行了一些更改,谢谢您的帮助:)
【解决方案2】:

试试这个:

SELECT name, SAL1, SAL2, SAL3, 
       ROUND(SAL1 * 1.0 / x.v * 100, 1) AS SAL_calculated
FROM mytable 
CROSS JOIN (SELECT SUM(SAL1) FROM mytable) AS x(v)
ORDER BY name, SAL1 DESC, SAL2 DESC, SAL3 DESC

【讨论】:

    【解决方案3】:

    这就是我所做的,

    在子查询中,我们可以将前 n 条记录或整组记录的聚合存储到变量 a 中,然后将该变量用作分母。

    将@a 声明为整数 = 0 选择@a = ( 选择 TOP2_SAL = 总和(SAL1) 从 ( 选择前 2 个 SAL1 来自 [dbo].[测试] ORDER BY SAL1 desc ) C ) 选择 *, t.SAL1 * 100 / @a 来自 [dbo].[测试] t

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-07
      • 2020-09-02
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 2015-10-09
      • 2018-11-20
      • 2012-05-15
      相关资源
      最近更新 更多