Hanya ingin tahu tentang sintaks SQL. Jadi kalau sudah
SELECT
itemName as ItemName,
substring(itemName, 1,1) as FirstLetter,
Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter
Ini akan salah karena
GROUP BY itemName, FirstLetter
memang seharusnya begitu
GROUP BY itemName, substring(itemName, 1,1)
Tapi mengapa kita tidak bisa menggunakan yang pertama untuk kenyamanan?
Jawaban:
SQL diimplementasikan seolah-olah kueri dieksekusi dalam urutan berikut:
Untuk sebagian besar sistem basis data relasional, urutan ini menjelaskan nama (kolom atau alias) mana yang valid karena mereka harus sudah diperkenalkan pada langkah sebelumnya.
Jadi di Oracle dan SQL Server, Anda tidak bisa menggunakan istilah dalam klausa GROUP BY yang Anda tetapkan dalam klausa SELECT karena GROUP BY dijalankan sebelum klausa SELECT.
Ada beberapa pengecualian: MySQL dan Postgres tampaknya memiliki kecerdasan tambahan yang memungkinkannya.
sumber
GROUP BY substring(itemName, 1,1)
, apakah databasenya cukup pintar untuk tidak mengambil kinerja hit mengkompilasi ulang substring dalam klausa SELECT?sql_mode
tidak termasuk ONLY_FULL_GROUP_BY dalam bitmask, Pengoptimal memiliki kesempatan untuk memberikan hasil yang lebih baik dengan beragam / berbeda penggunaan alias dalamHAVING
klausa.Anda selalu dapat menggunakan subquery sehingga Anda dapat menggunakan alias; Tentu saja, periksa kinerjanya (Kemungkinan server db akan menjalankan keduanya sama, tetapi tidak ada salahnya untuk memverifikasi):
sumber
Paling tidak di PostgreSQL Anda bisa menggunakan nomor kolom di resultset di klausa GROUP BY Anda:
Tentu saja ini mulai menyebalkan jika Anda melakukan ini secara interaktif dan Anda mengedit kueri untuk mengubah jumlah atau urutan kolom dalam hasilnya. Tetapi tetap saja.
sumber
GROUP BY FirstLetter
diizinkan di Postgresql. Untuk kecerdasan, coba jalankan ini di Postgresql: pilih substring (table_name, 1,2) sebagai tname dari information_schema.tables grup dengan tnameGROUP BY
ekspresi apa pun yang berisi fungsi agregat atau fungsi jendela, yang "jelas" tidak berfungsi.SQL Server tidak memungkinkan Anda untuk merujuk alias dalam klausa GROUP BY karena urutan pemrosesan yang logis. Klausa GROUP BY diproses sebelum klausa SELECT, sehingga alias tidak diketahui saat klausa GROUP BY dievaluasi. Ini juga menjelaskan mengapa Anda dapat menggunakan alias di klausa ORDER BY.
Berikut ini adalah satu sumber untuk informasi tentang fase pemrosesan logis SQL Server .
sumber
Saya tidak menjawab mengapa demikian, tetapi hanya ingin menunjukkan cara mengatasi keterbatasan dalam SQL Server dengan menggunakan
CROSS APPLY
untuk membuat alias. Anda kemudian menggunakannya dalamGROUP BY
klausa, seperti:sumber
Perhatian bahwa menggunakan alias di Group By (untuk layanan yang mendukungnya, seperti postgres) dapat memiliki hasil yang tidak diinginkan. Misalnya, jika Anda membuat alias yang sudah ada di pernyataan bagian dalam, Group By akan memilih nama bidang bagian dalam.
sumber
Beberapa DBMS akan membiarkan Anda menggunakan alias alih-alih mengulangi seluruh ekspresi.
Teradata adalah salah satu contohnya.
Saya menghindari notasi posisi ordinal seperti yang direkomendasikan oleh Bill untuk alasan yang didokumentasikan dalam pertanyaan SO ini .
Alternatif yang mudah dan kuat adalah untuk selalu mengulangi ekspresi dalam klausa GROUP BY.
KERING TIDAK berlaku untuk SQL.
sumber
Hati-hati menggunakan alias saat mengelompokkan hasil dari tampilan dalam SQLite. Anda akan mendapatkan hasil yang tidak terduga jika nama alias sama dengan nama kolom dari tabel yang mendasari (untuk tampilan.)
sumber
Kembali pada hari saya menemukan bahwa Rdb, produk DEC sebelumnya sekarang didukung oleh Oracle memungkinkan alias kolom untuk digunakan dalam GROUP BY. Mainstream Oracle melalui versi 11 tidak memungkinkan alias kolom untuk digunakan dalam GROUP BY. Tidak yakin apa yang akan atau tidak akan diizinkan oleh Postgresql, SQL Server, MySQL, dll. YMMV.
sumber