SQLクエリでは、Groupby句を使用して集計関数を適用します。

  • しかし、Group by句で列名の代わりに数値を使用する目的は何ですか?例:1でグループ化します。

コメント

  • order by 1は座っているときにのみ使用しますmysql> プロンプトで。コードでは、ORDER BY id ASCを使用します。大文字と小文字、明示的なフィールド名、明示的な順序の方向に注意してください。

回答

これは実際には非常に悪いですIMHOを実行する必要があり、他のほとんどのデータベースプラットフォームではサポートされていません。

人々がそれを実行する理由:

  • they “re lazy -さらに40ミリ秒入力してより多くのリテラルコードを取得するのではなく、簡潔なコードを記述することで生産性が向上すると人々が考える理由はわかりません。

それが悪い理由:

  • それは自己文書化ではありません-誰かがSELECTリストを解析してグループ化を理解する必要があります。実際には、カウボーイをサポートしていないSQLServerではもう少し明確になります- MySQLのように何が起こるかを知っています。

  • 脆弱です-誰かが入ってSELECTリストを変更するのは、ビジネスユーザーは別のレポート出力を望んでいましたが、今では出力が混乱しています。 GROUP BYで列名を使用した場合、SELECTリストでの順序は関係ありません。

SQLServerはORDERBY [序数]をサポートしています。使用に反対するいくつかの並列引数は次のとおりです。

回答

MySQLを使用すると、エイリアス(iv)を使用してGROUP BYを実行できます。 id = “472b56c1b7″>

列エイリアスの問題)。これは、数字を使ってGROUP BYを実行するよりもはるかに優れています。

Googleには多くの使用例があり、多くの人が使用をやめた理由があります。

正直なところ、ORDER BYとの列番号は使用していません。 GROUP BY 1996年以来(私は当時Oracle PL / SQL開発を行っていました)。列番号の使用は本当に昔の人向けであり、下位互換性により、そのような開発者はMySQLやその他のRDBMSを使用できます。

回答

以下のケースを検討してください:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Apps | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Apps | 1 | | 2016-05-31 | Videos | 1 | | 2016-05-31 | Videos | 1 | | 2016-06-01 | Apps | 3 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Videos | 2 | | 2016-06-01 | Apps | 2 | +------------+--------------+-----------+ 

Appsとアプリケーションを同じサービスと見なして、1日あたりのサービスあたりのダウンロード数を確認する必要があります。 date, servicesでグループ化すると、AppsApplicationsは別々のサービスと見なされます。

その場合、クエリは次のようになります:

 select date, services, sum(downloads) as downloads from test.zvijay_test group by date,services 

および出力:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Apps | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Apps | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

ただし、アプリケーションとアプリをグループ化する必要があるため、これは必要なことではありません。では、何ができるでしょうか?

1つの方法は、iv id = “を使用してAppsApplicationsに置き換えることです。 143a6dbc27 “>

式またはIF関数を使用して、サービスごとに次のようにグループ化します。

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,services 

ただし、これでもAppsApplicationsを異なるサービスと見なしてサービスがグループ化され、以前と同じ出力が得られます。

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Applications | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Applications | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

列番号をグループ化すると、エイリアス列のデータをグループ化できます。

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,2; 

したがって、次のように目的の出力が得られます。

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 4 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 9 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

I “veこれはクエリを書く怠惰な方法であるか、エイリアス列をグループ化する方法はMySQLでは機能しないことを何度も読んでください。ただし、これはエイリアス列をグループ化する方法です。

これはクエリを作成するための好ましい方法ではありません。次の場合にのみ使用してくださいエイリアス列をグループ化する必要があります。

コメント

  • " ただし、これでもアプリとアプリケーションを異なるサービスと見なしてサービスをグループ化し、以前と同じ出力を提供します "。'エイリアスに別の(競合しない)名前を選択した場合、これは解決されませんか?
  • @ Daddy32まさに私の考え。または、もう一度ネストします(選択後にグループ化します)

回答

使用する正当な理由はありません。これは単に怠惰なショートカットであり、ハードプレスされた開発者が後でグループ化や並べ替えを理解するのを困難にしたり、誰かが列の順序を変更したときにコードが惨めに失敗するのを防ぐために特別に設計されています。仲間の開発者に配慮し、それを行わないでください。

回答

これは私のために機能します。コードは最大5つのグループの行。

SELECT USR.UID, USR.PROFILENAME, ( CASE WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN @curRow := 0 ELSE @curRow := @curRow + 1 /*@curRow := 1*/ /*AND @curCode := USR.UID*/ END ) AS sort_by_total FROM SS_USR_USERS USR, ( SELECT @curRow := 0, @curCode := "" ) rt ORDER BY USR.PROFILENAME, USR.UID 

結果は次のようになります

ここに画像の説明を入力

回答

SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2; SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3; 

上記のクエリを検討してください:1でグループ化することは最初の列でグループ化することを意味し、1,2でグループ化することは1番目と2番目の列でグループ化することを意味し、1,2,3でグループ化することはグループ化することを意味します最初の2番目と3番目の列で。例:

1,2でグループ化

この画像は、1,2でグループ化された最初の2つの列を示しています。つまり、カウントを見つけるためにdep_dateの異なる値を考慮していません(カウントを計算するには、最初の2つの列のすべての異なる組み合わせが考慮されます)一方、2番目のクエリはこの 1,2,3でグループ化

画像。ここでは、最初の3列すべてを考慮し、カウントを見つけるためにさまざまな値があります。つまり、最初の3列すべてでグループ化しています(カウントを計算するには、最初の3列のすべての異なる組み合わせが考慮されます)。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です