Saya memiliki kode ini yang merangkum jumlah untuk item tertentu ( itemid
) dan kode tanggal produknya ( proddte
).
select sum(qty), itemid, proddte
from testtable where ....
group by itemid, proddte
Yang ingin saya lakukan adalah mendapatkan total semua qty
terlepas dari itemid/proddte
. Saya telah mencoba:
select sum(qty), itemid, proddte, sum(qty) over() as grandtotal
from testtable
where ....
group by itemid, proddte
Tapi katanya saya juga harus ada qty
dalam group by
klausa. Jika saya melakukan itu, hasilnya tidak akan sama dengan hasil yang saya harapkan.
Itu tidak benar-benar perlu direpresentasikan sebagai kolom terpisah, dengan nilai yang sama di setiap baris. Representasi apa pun diterima selama saya dapat menampilkan total keseluruhan.
sumber
GROUP BY ROLLUP((itemid,proddte))
akan menghasilkan hasil yang sama dan mungkin kurang membingungkan.itemid
Ie Ini setara denganGROUP BY GROUPING SETS((),(itemid),(itemid,proddte))
GROUP BY ROLLUP(itemid,proddte)
, di sisi lain, memang akan menghasilkan subtotal (tambahan) padaitemid
(sama sepertiGROUP BY ROLLUP((itemid),(proddte))
). Demo di SEDEGROUP BY ROLLUP
terlalu membingungkan, tapi agak subyektif. Saya juga selalu gugup ketika membaca hal-hal sepertiThe non-ISO compliant WITH ROLLUP, WITH CUBE, and ALL syntax is deprecated
- mengapa saya cenderung menyukaiGROUPING SETS
.Ini juga sintaks yang valid:
Agak membingungkan ketika orang melihatnya pada awalnya tetapi Anda hanya perlu mengingat bahwa fungsi jendela - misalnya
sum() over ()
- diterapkan setelahgroup by
sehingga segala sesuatu yang dapat muncul dalam daftar pilih grup berdasarkan kueri dapat ditempatkan di dalam agregat jendela. Jadi (qty
tidak bisa tetapi)sum(qty)
dapat ditempatkan di dalamsum() over ()
:Karena itu, saya lebih suka
GROUPING SETS
permintaan yang disediakan oleh Aaron Bertrand. Jumlah total perlu ditampilkan sekali dan tidak di setiap baris.Perhatikan juga bahwa sementara jumlah jumlah dapat digunakan untuk menghitung jumlah total, jika Anda menginginkan jumlah total, Anda harus menggunakan jumlah jumlah (dan bukan jumlah hitungan!):
Dan jika seseorang menginginkan rata-rata dari semua tabel, itu akan menjadi lebih rumit:
karena rata-rata rata-rata tidak sama dengan rata-rata di atas semua. (Jika Anda mencoba,
avg(avg(qty)) over ()
Anda akan melihat bahwa itu dapat menghasilkan hasil yang berbeda dari rata-rata grand di atas.)sumber
Salah satu cara yang mungkin dilakukan adalah memasukkan yang pertama
GROUP BY
ke dalam CTE :sumber