誰かがこのチュートリアルの累計と SQL 自己結合について説明してもらえますか?

StackOverflow https://stackoverflow.com/questions/2529367

  •  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

このクエリの簡単な部分は、各従業員のために売上データを表示しています。私たちがやっているすべては、各従業員からnamesalesを選択し、販売量(降順)でそれらを注文しています。これが私たちの基本リストが表示されます。

今すぐ実行中の合計のために、我々は既に表示されているすべての行をしたいです。そこで、我々は、既に表示されていたであろう各行に、それ自体に対してテーブルを結合ます:

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top