如何按一组数据订购?

时间:2012-04-04 14:18:06

标签: sql sql-server sql-server-2008 tsql

我被要求创建一个按年分组的收入最多的特许经营清单,但是按订单条款需要按收入最多的特许经营商订购,具体取决于日期范围。我可以按单笔(收入)罚款订购,但我如何按收入订购特许经营分组?

group by
    vFranMasterNumRollup.MasterFranNumber, 
    REPLACE(vFranMasterNumRollup.FranchiseName, ',', '') ,
    YEAR(vremittheaderdetailandfran.remd_ServiceDate)
order by
    sum(vremittheaderdetailandfran.remd_LaborRevenue) desc,
    REPLACE(vFranMasterNumRollup.FranchiseName, ',', '')

你在这里看到我试图在订购中添加另一列,但我想按降序将最高的特许经营组合在一起

如果您需要更多代码,请告诉我

以下是更多代码:

SELECT     vFranMasterNumRollup.MasterFranNumber, REPLACE(vFranMasterNumRollup.FranchiseName, ',', '') AS FranchiseName, 
sum(vremittheaderdetailandfran.remd_LaborRevenue),YEAR(vremittheaderdetailandfran.remd_ServiceDate) 
FROM         vremittheaderdetailandfran INNER JOIN
                      vFranMasterNumRollup ON vremittheaderdetailandfran.remh_FranchiseNumber = vFranMasterNumRollup.fran_FranchiseID
WHERE     (vremittheaderdetailandfran.remd_ServiceDate BETWEEN @startdate and @enddate AND (vFranMasterNumRollup.fran_Status = N'ACTIVE') OR
                      (vremittheaderdetailandfran.remd_ServiceDate BETWEEN @startdate and @enddate))
group by vFranMasterNumRollup.MasterFranNumber, 
REPLACE(vFranMasterNumRollup.FranchiseName, ',', '') , YEAR(vremittheaderdetailandfran.remd_ServiceDate)
order by sum(vremittheaderdetailandfran.remd_LaborRevenue) desc,REPLACE(vFranMasterNumRollup.FranchiseName, ',', '')

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你可能想要这样的东西:

ORDER BY
   SUM(SUM(vremittheaderdetailandfran.remd_LaborRevenue))
     OVER (PARTITION BY vFranMasterNumRollup.MasterFranNumber),
   REPLACE(vFranMasterNumRollup.FranchiseName, ',', '')

SUM(…) OVER (…)是一个窗口聚合函数。此特定窗口SUM()计算WHERE子句中指定的整个范围内的总计,按vFranMasterNumRollup.MasterFranNumber对其进行分组(分区)(我理解这是一种特许经营的唯一标识符)。 / p>

窗口SUM()的参数通常是包含列引用的列或表达式,就像它与“普通”SUM()一样。在这种情况下,您可以看到另一个SUM()作为参数。另一个SUM()是“正常”聚合函数。我们必须直接引用vremittheaderdetailandfran.remd_LaborRevenue的聚合值而不是列,因为这是GROUP BY查询,并且有问题的列未包含在GROUP BY子句中。结果,整个表达式读作“remd_LaborRevenue之和的总和”,我想这在这种情况下非常有意义。

您可以在OVER Clause (Transact-SQL)手册中阅读有关窗口聚合函数的更多信息。

答案 1 :(得分:0)

如果您使用分组依据,则需要按参与分组的任何列或其中一个聚合列(例如SUM)进行排序

此外,您不需要在订单上添加完整的聚合函数,您只需执行“order by”并添加列的索引即可。例如:

select columns1, column2, sum(coulm3)
from table1
group by columns1, column2
order by 3

将按SUM订购