Saya memiliki dua tabel berbeda di mana saya menerapkan query pilih dengan beberapa filter dan fungsi agregat seperti SUM, COUNT, SUBSTR.
Saya ingin mendapatkan dua output yang berbeda ini dalam satu hasil:
Kueri 1:
SELECT
a.message_type,
a.queue_seqnum,
b.queue_seqnum,
SUBSTR(b.char_data,1,2) files
FROM
ad_in_messageheader a,
ad_in_messagedetail b
WHERE
a.queue_seqnum = b.queue_seqnum AND
a.MESSAGE_TYPE IN ('ERP_COSTS_SMRY','ERP_SALES_SMRY','ERP_SPEND_SMRY') AND
a.create_time > '17-DEC-13 07.00.00 AM'
ORDER BY
a.queue_seqnum desc;
Kueri 2:
SELECT
a.message_type,
count(a.message_type) count
FROM
ad_in_messageheader a
WHERE
a.MESSAGE_TYPE in ('ERP_COSTS','ERP_SALES','ERP_SPEND') AND
create_time > '17-DEC-13 07.00.00 AM'
GROUP BY
a.message_type;
Saya telah mencoba UNION
dan UNION ALL
keduanya. Tetapi keduanya tidak bekerja. Saya juga mencoba Pilih * dari (kueri 1), (kueri 2)
, Tapi itu juga tidak berhasil. Mohon sarankan saya beberapa solusi yang akan membantu dalam skenario ini. Terima kasih.
Ada dua cara untuk menyatukan kueri: Menyamping dengan menggunakan joins dan di atas satu sama lain dengan unions. Ketika menggunakan joins, hasilnya akan menyertakan kolom dari kedua kueri. Ketika menggunakan unions, hasilnya akan menyertakan baris-baris dari kedua queri. Agar unions berfungsi, kedua queri harus mengembalikan jumlah kolom yang sama.
Saya berasumsi bahwa Anda ingin menambahkan hitungan yang dihitung dalam kueri kedua sebagai kolom ke kueri pertama. Ini bekerja seperti ini (saya menggunakan sintaks JOIN
baru):
SELECT
q1.x, q1.y, q2.z, ...
FROM
(SELECT ... FROM ...) q1
LEFT JOIN
(SELECT ... FROM ...) q2
ON q1.column = q2.column
Anda juga dapat menggunakan INNER JOIN
alih-alih LEFT JOIN
jika Anda tahu bahwa kueri2 menghasilkan setidaknya satu baris untuk setiap baris kueri1 atau jika Anda tidak tertarik dengan baris dari kueri1 di mana baris yang sesuai tidak ada dari kueri2.
SELECT
q1.message_type,
q1.queue_seqnum,
q1.files,
q2.message_count
FROM (SELECT
a.message_type,
a.queue_seqnum,
SUBSTR(b.char_data, 1, 2) files
FROM
ad_in_messageheader a,
INNER JOIN ad_in_messagedetail b
ON a.queue_seqnum = b.queue_seqnum
WHERE
a.message_type IN ('ERP_COSTS_SMRY', 'ERP_SALES_SMRY', 'ERP_SPEND_SMRY') AND
a.create_time > '17-DEC-13 07.00.00 AM') q1
LEFT JOIN
(SELECT
a.message_type,
COUNT(a.message_type) message_count
FROM
ad_in_messageheader a
WHERE
a.message_type IN ('ERP_COSTS', 'ERP_SALES', 'ERP_SPEND') AND
create_time > '17-DEC-13 07.00.00 AM'
GROUP BY
a.message_type) q2
ON q1.message_type = q2.message_type
ORDER BY
q1.queue_seqnum DESC;
Saya juga akan melakukan pengurutan setelah menggabungkan dua sub kueri, karena proses penggabungan dapat menghancurkan urutan yang telah dibuat sebelumnya.
Ada juga masalah dengan jenis pesan: Anda tidak memilih jenis pesan yang sama dalam dua sub queri. Di ORACLE, Anda dapat menggunakan fungsi DECODE
untuk menerjemahkan jenis pesan agar cocok
Dalam sub kueri 1:
SELECT
DECODE(a.message_type,
'ERP_COSTS_SMRY', 'ERP_COSTS',
'ERP_SALES_SMRY', 'ERP_SALES',
'ERP_SPEND_SMRY', 'ERP_SPEND') message_type
Jika create_time
adalah kolom DATE
, anda harus mengkonversi string tanggal/waktu menjadi tanggal.
WHERE
a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')
(See https://stackoverflow.com/a/10178346/880990)
Juga gunakan tahun empat digit jika memungkinkan. Ini lebih aman. Apakah 31
1931
atau 2031
? Juga, angka bulan akan bekerja juga pada sistem dengan lokal yang berbeda. DEC
tidak akan dikenali pada sistem Jerman. Sebaliknya, DEZ
yang diharapkan.
Jika Anda menggunakan union atau union all untuk menggabungkan beberapa query, maka setiap query harus memiliki jumlah kolom yang sama dengan tipe data yang sama.
Gunakan query di bawah ini:
SELECT a.message_type,a.queue_seqnum, b.queue_seqnum,SUBSTR (b.char_data,1,2)
files,0 as count FROM ad_in_messageheader a, ad_in_messagedetail b WHERE a.queue_seqnum =
b.queue_seqnum AND a.MESSAGE_TYPE in
('ERP_COSTS_SMRY','ERP_SALES_SMRY','ERP_SPEND_SMRY') AND
a.create_time > '17-DEC-13 07.00.00 AM'
union all
SELECT a.message_type,'' as queue_seqnum,'' as queue_seqnum, '' as files
count(a.message_type) count FROM ad_in_messageheader a
where a.MESSAGE_TYPE in ('ERP_COSTS','ERP_SALES','ERP_SPEND') AND
create_time > '17-DEC-13 07.00.00 AM' group by a.message_type
Dan Anda harus menggunakan order by
akhirnya setelah menggabungkan kedua kueri ..