誰かがこのチュートリアルの累計と SQL 自己結合について説明してもらえますか?
-
22-09-2019 - |
質問
私はここでチュートリアルを読んでいました: http://www.1keydata.com/sql/sql-running-totals.html そしてそれはすべて理にかなっていましたが、順位、中央値、累計などになると、突然非常にばかばかしく信じられないほど複雑になりました。誰かがそのクエリがどのように累計を算出するのか、分かりやすい英語で説明してもらえますか?ありがとう!
解決
は、私が前にこれを見ていませんでしたし、それが実行中の合計を達成するためにひどく分かりやすい方法のように見えません。
さて、ここではチュートリアルからのクエリがあります:
SELECT a1.Name, a1.Sales, SUM(a2.Sales) Running_Total
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales <= a2.sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name DESC;
とサンプル出力
Name Sales Running_Total
Greg 50 50
Sophia 40 90
Stella 20 110
Jeff 20 130
Jennifer 15 145
John 10 155
このクエリの簡単な部分は、各従業員のために売上データを表示しています。私たちがやっているすべては、各従業員からname
とsales
を選択し、販売量(降順)でそれらを注文しています。これが私たちの基本リストが表示されます。
今すぐ実行中の合計のために、我々は既に表示されているすべての行をしたいです。そこで、我々は、既に表示されていたであろう各行に、それ自体に対してテーブルを結合ます:
WHERE a1.Sales <= a2.sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
その後、我々はそれに応じてSUM
集計関数とグループを使用します。あなたは、グループ機能を使用しなかった場合はどうなるのかを見れば、これを理解するための良い方法です。 「ソフィア」の行は次のようになります:
Name A1.Sales A2.Sales
Sophia 40 50
Sophia 40 40
私たちはグレッグの販売行を持って注意してくださいどのように?グループがそのアップし、出来上がりを合計します!
希望に役立ちます。ジョー
他のヒント
最初のテーブルはそれ自体に結合します。結合の結果、行数は x になります。ここで、x は、合計売上高がそれ自体より低い行数、または行内の名前が同じです (つまり、売上高順に並べた場合、見ている行の前のすべての売上)。
次に、結合の左側のフィールドをグループ化し、結合する行を合計して累計を計算します。どのように動作するかを確認するには、合計やグループ化を行わずに実行して、返される生の結果を確認するとよいでしょう。
は、上記SQLは、Sybase(ASE 15)に異なる結果を与えます。私は理由が「で順序が」表示時間まで適用されていないということだと思います。ここではSQLと結果は次のとおりです。
drop table Total_Sales
go
create table Total_Sales
(
Name char(15),
Sales int
)
INSERT INTO Total_Sales VALUES( 'John', 10 )
INSERT INTO Total_Sales VALUES( 'Jennifer', 15)
INSERT INTO Total_Sales VALUES('Stella', 20 )
INSERT INTO Total_Sales VALUES('Sophia', 40 )
INSERT INTO Total_Sales VALUES('Greg', 50 )
INSERT INTO Total_Sales VALUES('Jeff', 20 )
SELECT a1.Name, a1.Sales, SUM(a2.Sales) Running_Total
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales <= a2.Sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name DESC
結果:
Name Sales Running_Total
Greg 50 50
Sophia 40 90
Stella 20 130 --note that two running totals are the same!
Jeff 20 130
Jennifer 15 145
John 10 155
ボブ
私も同じ販売数を持っているステラ&ジェフのところ実行されている総ブレイクダウンし、上記のボブと同じ間違った出力を得ます。私は、SQL Serverの管理Studio 2014 Expressを使用しています。私は、ウェブサイトのソリューションは、実際に正しいとは思いません。
:私は、正しい実行中の合計を生産する、参加を名前ではなく、売上高に基づいており、これらを思い付きましたselect a1.name
, a1.sales
, sum(a2.sales) 'running_total'
from #total_sales a1
inner join #total_sales a2 on a1.name <= a2.name
group by a1.name, a1.sales
order by sum(a2.sales);
収量ます:
name sales running_total
Stella 20 20
Sophia 40 60
John 10 70
Jennifer 15 85
Jeff 20 105
Greg 50 155
また、あなたは集計に不快ソートしている場合は、以下のバリアントを行うことができます。これは、順序を変更しますが、実行中の合計は正しいです。
select a1.name
, a1.sales
, sum(a2.sales) 'running_total'
from #total_sales a1
inner join #total_sales a2 on a1.name >= a2.name
group by a1.name, a1.sales
order by a1.name;
収量ます:
name sales running_total
Greg 50 50
Jeff 20 70
Jennifer 15 85
John 10 95
Sophia 40 135
Stella 20 155