2

年ごとにグループ化された収益が最も多いフランチャイズのリストを作成するように依頼されましたが、order by 句は、日付範囲に応じて収益が最も多いフランチャイズで並べ替える必要があります。単一の合計 (収益) 罰金で注文できますが、フランチャイズ グループを収益で注文するにはどうすればよいですか?

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, ',', '')
4

2 に答える 2

1

私があなたを正しく理解していれば、おそらく次のようなものが必要です。

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

事は、SUM(…) OVER (…)ウィンドウ集約関数です。この特定のウィンドウは、句でSUM()指定された範囲全体の合計を計算し、それらをグループ化 (パーティション化) します(これはフランチャイズの一意の識別子のようなものだと理解しました)。WHEREvFranMasterNumRollup.MasterFranNumber

windowed の引数は、SUM()通常、「通常の」の場合と同様に、列または列参照を含む式SUM()です。SUM()この場合、引数として別のものを見ることができます。もう 1 つSUM()は「通常の」集約関数です。vremittheaderdetailandfran.remd_LaborRevenueこれはGROUP BYクエリであり、問​​題の列はGROUP BY句に含まれていないため、列の代わりに集計値を直接参照する必要があります。その結果、式全体は「合計の合計」と読みますremd_LaborRevenue。これは、この文脈では完全に理にかなっていると思います。

ウィンドウ集計関数の詳細については、OVER 句 (Transact-SQL)マニュアルを参照してください。

于 2012-04-04T18:06:03.410 に答える
0

グループ化を使用している場合は、グループ化に参加する列のいずれか、または集計列の 1 つ (SUM など) で並べ替える必要があります。

また、order by に完全な集計関数を追加する必要はありません。単純に「order by」を実行して、列のインデックスを追加できます。例えば:

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

SUMで注文します

于 2012-04-04T14:39:39.890 に答える