GROUP BYとCOMPUTEの理解

3345 ワード

注意:select 後のフィールドはgroupに含めるか byに含まれるかhavingに含まれるか 後の集約関数にあります.1. GROUP BY. グループクエリーです. 一般 GROUP BY. 集約関数との併用
group by 一つの原則は プロジェクト 次のすべてのカラムで、集約関数を使用しないカラムは、 group by 後(重要)
たとえば、次のデータベース・テーブルがあります.
A    B 1    abc 1    bcd 
1    asdfg
次のクエリ文がある場合(この文は間違っています.理由は前の原則を参照してください)
プロジェクト A,B from テーブル group by A  
このクエリ文は、次のような結果を得ることを意図しています(もちろん、望ましいだけです). 
A     B    abc 1     bcd 
   asdfg 
右の3つがどのように1つになるかは、集約関数を使用する必要があります(次は正しい書き方です).
プロジェクト A,count(B) as 数量 from テーブル group by A このような結果は A    数量 1    3  
2. Having
where 句の役割は、クエリー結果をグループ化する前に、where条件に合致しない行を削除することです.すなわち、グループ化する前にデータをフィルタします.条件にはグループ化関数が含まれず、where条件を使用して特定の行を表示します.
having 句の役割は、条件を満たすグループをフィルタリングすることです.すなわち、パケットの後にデータをフィルタリングします.条件には、havingを使用する集約関数がよく含まれます. 条件は、特定のグループを表示します.また、複数のグループ基準を使用してグループ化することもできます.
having サブステートメントは、SELECT文で定義されたカラムと集約式に制限されます.通常、SELECT文で行ったように、HAVING句で集約関数式を繰り返して集約値を参照する必要があります.例:
SELECT A COUNT(B) FROM TABLE GROUP BY. A HAVING COUNT(B)>2
3.computeとcomputeを使う by compute句を使用すると、クエリーで得られた各カラムのデータの詳細と、各カラムのデータを統計して生成された要約カラムを同時に観察できます.  プロジェクト * from work [クエリで得られた各カラムのデータの詳細]  compute max(基本給)、min(基本給) [統計後の結果]この例ではbyキーは使用されていませんが、最後に基本給の最大値と最小値が1行追加され、byキーを追加することもできます.例:
プロジェクト * from work order by 学歴 compute max(基本給)、min(基本給) by 学歴比較:select 学歴、max(基本給)、min(基本給) from work group by 学歴説明:
1:compute句はorderと by句を一緒に使う
2:compute句は多種の結果セットを返すことができる.1つはデータの細部を体現するデータセットで、分類の要求によって正確な分類を行うことができる.もう1つは分類に基づいてまとめた結果である.
3:そしてグループ by句は各クラスのデータを分類した後に1つの結果しか生成できず,詳細は分からない
サンプル学習Northwindデータベース:
非相関クエリー:
1:すべてのアメリカ人従業員が注文を処理したすべての顧客を返します.
--考え方:1:Employees表でアメリカ人従業員総数を取得2:Orders表でアメリカ人従業員が処理したOrderを照会し、CustomerIDをグループ化した後、その異なるEmployeeIDがアメリカ人従業員総数に等しいことを統計する
Select CustomerID From Orders Where EmployeeID In
--            
(Select EmployeeID From Employees Where Country=N'USA')
--        id
group by CustomerID    --     
Having Count(Distinct EmployeeID)=
--       distinct            
(SelectCount(*)From Employees Where Country=N'USA')--      

2:毎月の最終受注日に発生した受注を返します(毎月の最終受注日は毎月の最終日ではない場合があります).
--考え方:サブクエリは月ごとにグループ化され、毎月の最近の注文日を取得します.
Select OrderID,CustomerID,EmployeeID,OrderDate From Orders Where OrderDate In(Select Max(OrderDate)From Orders Group by Convert(char(6),OrderDate,112))--112  YYYYMMDD char(6)  YYYYMM

 3.
Select文は論理的にSQL文の最後の処理の最後のステップであるため、次のクエリでエラーが発生します.
SELECT OrderYear, COUNT(DISTINCT CustomerID) AS NumCusts FROM (SELECT YEAR(OrderDate) AS OrderYear, CustomerID  FROM dbo.Orders) AS D
GROUP BY OrderYear

グループは byはSelectの前に行われていましたが、その時orderYearという列は形成されていませんでした.
クエリーを正常に実行するには、次のように変更します.
SELECT OrderYear, COUNT(DISTINCT CustomerID) AS NumCusts FROM (SELECT YEAR(OrderDate) AS OrderYear, CustomerID FROM dbo.Orders) AS D GROUP BY OrderYear

もう一つの特殊な書き方があります.
SELECT OrderYear, COUNT(DISTINCT CustomerID) AS NumCusts FROM (SELECT YEAR(OrderDate), CustomerID  FROM dbo.Orders) AS D(OrderYear, CustomerID) GROUP BY OrderYear

作者の目には、彼はこのような書き方が大好きです.もっとはっきりしていて、もっと明確で、メンテナンスしやすいからです.
クエリーでパラメータ配向を使用して結果を生成するテクニックは、何も言えません.
ネストされたクエリーは、処理論理的に内側から外側に実行されます.
  転載:ブログ園