回答:
これは実際に私見を行うには本当に悪いことであり、他のほとんどのデータベースプラットフォームではサポートされていません。
人々がそれをする理由:
悪い理由:
それは自己文書化ではありません -誰かがグループ化を理解するためにSELECTリストを解析する必要があります。実際には、SQL Serverではもう少し明確になります。SQLServerは、MySQLのように何が起こるかを知っているカウボーイグループ化をサポートしていません。
それは脆性だ -誰かが入って来やビジネスユーザーが別のレポート出力を望んでいた、そして今、あなたの出力が混乱であるため、SELECTリストを変更します。GROUP BYで列名を使用していた場合、SELECTリストの順序は関係ありません。
SQL ServerはORDER BY [ordinal]をサポートしています。以下は、その使用に対するいくつかの並行する引数です。
MySQLではGROUP BY
、エイリアスを使用できます(列エイリアスの問題)。これはGROUP BY
、数値を使用するよりもはるかに優れています。
column number
SQLダイアグラムにあるものもあります。1行は、指定された列番号または式で結果をソートします。式が単一のパラメーターである場合、値は列番号として解釈されます。負の列番号はソート順を逆にします。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 |
+------------+--------------+-----------+
アプリとアプリケーションを同じサービスと見なして、サービスごとの1日あたりのダウンロード数を調べる必要があります。グループ化するdate, services
ことになるApps
とApplications
、別のサービスを検討されています。
その場合、クエリは次のようになります。
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つの方法は、式または関数Apps
をApplications
使用して置き換えることで、それらをサービス上で次のようにグループ化することです。CASE
IF
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,services
しかし、これはまだグループのサービスは、考慮Apps
し、Applications
さまざまなサービスなど、以前と同じ出力が得られます。
+------------+--------------+-----------+
| 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 |
+------------+--------------+-----------+
私はこれがクエリを記述する怠zyな方法であるか、エイリアス列をグループ化することはMySQLでは機能しないことを何度も読みましたが、これはエイリアス列をグループ化する方法です。
これはクエリを記述するための好ましい方法ではありません。エイリアス列でグループ化する必要がある場合にのみ使用してください。
これは私のために働いています。このコードは、最大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でグループ化することは最初と2番目の列でグループ化することを意味します。例えば:
この画像は、1,2でグループ化された最初の2列を示しています。つまり、カウントを見つけるためにdep_dateの異なる値を考慮していません(最初の2列のすべての異なる組み合わせを考慮してカウントを計算します)。
画像。ここでは、最初の3列すべてを考慮し、カウントを見つけるために異なる値があります。つまり、最初の3列すべてでグループ化されます(カウントを計算するには、最初の3列のすべての異なる組み合わせが考慮されます)。
order by 1
に座っている場合にのみ使用してmysql>
ください。コードでは、を使用しますORDER BY id ASC
。ケース、明示的なフィールド名、および明示的な順序の方向に注意してください。