Sql server 如何按命名的聚合值对该结果集进行排序?

Sql server 如何按命名的聚合值对该结果集进行排序?,sql-server,sum,sql-order-by,Sql Server,Sum,Sql Order By,我有一个疑问: Select top 10 PAItemCode, PADescription, Sum(Qty) as 'Qty' from Invoice where Unit = 'Sodexo' group by PADescription, PAItemCode …这就是我想要的,只是我需要根据最后一列中的VAL对结果进行desc排序(总和(数量)为“数量”) 为此: Select top 10 PAItemCode, PADescription, Sum(Qty) as 'Qty'

我有一个疑问:

Select top 10 PAItemCode, PADescription, Sum(Qty) as 'Qty'
from Invoice
where Unit = 'Sodexo'
group by PADescription, PAItemCode
…这就是我想要的,只是我需要根据最后一列中的VAL对结果进行desc排序(总和(数量)为“数量”)

为此:

Select top 10 PAItemCode, PADescription, Sum(Qty) as 'Qty'
from Invoice
where Unit = 'Sodexo'
group by PADescription, PAItemCode
order by Qty
…所有QTY都是0(否则不是)。当我将“数量”夹在单引号中时也是如此:

. . .
order by Qty
如何通过聚合值降序将结果集排序?

这在MySQL上起作用。 您可以尝试更改别名,如下所示:

Select PAItemCode, PADescription, Sum(Qty) as 'Qtysum' 
from Invoice 
group by PADescription, PAItemCode 
order by Qtysum desc
这就是MySQL。 您可以尝试更改别名,如下所示:

Select PAItemCode, PADescription, Sum(Qty) as 'Qtysum' 
from Invoice 
group by PADescription, PAItemCode 
order by Qtysum desc
这应该行得通


这应该可以工作

代码的问题是聚合和别名列中使用的列具有相同的名称。将别名列名重命名为其他名称并按此新别名排序

代码的问题是聚合中使用的列和别名列中使用的列具有相同的名称。将别名列名重命名为其他名称并按此新别名排序

您还必须按的顺序包含总和(数量),但我的意见是与语句/CTE一起使用,它更具可读性,而且您还可以对分组数据应用其他逻辑

如果您在select语句中使用了任何agreegate函数,并且您还希望在GROUP BYORDER BY中使用该函数,那么您还必须应用相同的逻辑

SELECT 
    TOP 10 PAItemCode, 
    PADescription, 
    Sum(ISNULL(Qty,0)) as 'Qty'
FROM Invoice
WHERE Unit = 'Sodexo'
GROUP BY PADescription, PAItemCode
ORDER BY Sum(ISNULL(Qty,0))
使用CTE/和语句的替代方法:

;WITH T AS
(
    SELECT 
        TOP 10 PAItemCode, 
        PADescription, 
        Sum(ISNULL(Qty,0)) as 'Qty'
    FROM Invoice
    GROUP BY PADescription, PAItemCode
    WHERE Unit = 'Sodexo'
)
SELECT 
    T.PAItemCode,
    T.PADescription,
    T.Qty
FROM T  
ORDER BY T.Qty

您还必须的顺序包含总和(数量),但我的意见是与语句/CTE一起使用,它更具可读性,而且您还可以对分组数据应用其他逻辑

如果您在select语句中使用了任何agreegate函数,并且您还希望在GROUP BYORDER BY中使用该函数,那么您还必须应用相同的逻辑

SELECT 
    TOP 10 PAItemCode, 
    PADescription, 
    Sum(ISNULL(Qty,0)) as 'Qty'
FROM Invoice
WHERE Unit = 'Sodexo'
GROUP BY PADescription, PAItemCode
ORDER BY Sum(ISNULL(Qty,0))
使用CTE/和语句的替代方法:

;WITH T AS
(
    SELECT 
        TOP 10 PAItemCode, 
        PADescription, 
        Sum(ISNULL(Qty,0)) as 'Qty'
    FROM Invoice
    GROUP BY PADescription, PAItemCode
    WHERE Unit = 'Sodexo'
)
SELECT 
    T.PAItemCode,
    T.PADescription,
    T.Qty
FROM T  
ORDER BY T.Qty

我会非常小心地使用像
'Qty'
这样的别名——有些形式的别名已被弃用,而且在任何情况下看起来都像字符串文字。在SQL Server中,当需要引用标识符时,我更喜欢专有的
[Qty]
,但在这种情况下,它们不是,因为
Qty
不是保留字或关键字。很高兴知道,谢谢。我会非常小心地使用别名,如
'Qty'
-有些形式不推荐使用,在任何情况下,这看起来都像字符串文字。在SQL Server中,当需要引用标识符时,我更喜欢专有的
[Qty]
,但在这种情况下,它们不是,因为
Qty
不是保留字或关键字。很高兴知道,谢谢。我更喜欢CTE.Cougars跟踪大象?我不知道@shannon CTE代表什么?公共表表达式(CTE)可以将其视为在单个SELECT、INSERT、UPDATE、DELETE或CREATE VIEW语句的执行范围内定义的临时结果集。我更喜欢CTE。美洲狮跟踪大象?我无法理解@Shannon CTE代表什么?一个公共表表达式(CTE)可以将其视为在单个SELECT、INSERT、UPDATE、DELETE或CREATE VIEW语句的执行范围内定义的临时结果集