/ / groupbyおよびorderbyの問題-sql、sql-server

group byおよびorder byの問題-SQL、SQLサーバー

こんにちは私はSQLの世界の初心者ですが、いくつかの基本を機能させるのに苦労しています。

次のようなデータセットがあります。

Table name: Sample
PROJECT      WORK ORDER      AMOUNT
-----------------------------------------
111             a             100
222             b             200
111             c             300
444             d             400
111             e             500
666             f             600

私はそれが次のようになってしまうことを望みます:

Table name: Sample
PROJECT      WORK ORDER      AMOUNT     PROJECT AMOUNT
--------------------------------------------------------
111             e             500           900
111             c             300           900
111             a             100           900
666             f             600           600
444             d             400           600
222             b             200           200

合計金額が最も多いプロジェクトで並べ替え

Group byは、すべてのプロジェクトを1つにグループ化するため、機能しません。そのため、「Project111」の3つの作業指示行が表示されません。

PROJECT      WORK ORDER      AMOUNT
-----------------------------------------
111             a             900
222             b             200
444             d             400
666             f             600

最大のプロジェクト価値に基づいて分類することができないため、注文は機能しません。

Table name: Sample
PROJECT      WORK ORDER      AMOUNT
-----------------------------------------
666             f             600
111             e             500
444             d             400
111             c             300
222             b             200
111             a             100

私の別のアイデアは、別のものを作成できるかどうかでした「プロジェクト」列の値に基づいてプロジェクトの合計を計算する「プロジェクト量」列。代わりに、プロジェクト量で簡単に並べ替えて、目的の形式を実現できます。

Table name: Sample
PROJECT      WORK ORDER      AMOUNT     PROJECT AMOUNT
--------------------------------------------------------
111             e             500           900
111             c             300           900
111             a             100           900
666             f             600           600
444             d             400           600
222             b             200           200

しかし、「プロジェクトの金額」列を取得してすべてのプロジェクトの合計値を計算し、同じプロジェクト番号で表示される行にそれらを表示する方法に苦労しています。

アドバイスはありますか?

回答:

回答№1は4
select  *
,       sum(amount) over (partition by project) as ProjAmount
,       row_number() over
from    YourTable
order by
ProjAmount desc

SQL Fiddleの例


金額が最も多い上位2つのプロジェクトのみを選択するには、次を使用できます。 dense_rank

select  *
from    (
select  *
,       dense_rank() over (order by ProjAmount desc) as dr
from    (
select  *
,       sum(amount) over (partition by project) as ProjAmount
from    YourTable
) WithProjAmount
) WithDenseRank
where   dr < 3
order by
ProjAmount desc

SQL Fiddleの例


回答№2の場合は1

プレーンSQLサブクエリを備えたバージョン

SELECT s.*,
(SELECT SUM(Amount) FROM Sample WHERE Project = s.Project) ProjectAmount
FROM Sample s
ORDER BY ProjectAmount DESC

SQLFind


回答№3の場合は0
SELECT  a.project ,
a.work  ,
a.amount ,
b.proj_amount
FROM    project A
JOIN ( SELECT   SUM(amount) proj_amount ,
project
FROM     project
WHERE    project = project
GROUP BY project
) b ON a.project = b.project
ORDER BY proj_amount DESC ,
amount DESC