Pilih jumlah (*) dari beberapa tabel


230

Bagaimana saya dapat memilih count(*)dari dua tabel berbeda (panggil mereka tab1dan tab2) sebagai hasilnya:

Count_1   Count_2
123       456

Saya sudah mencoba ini:

select count(*) Count_1 from schema.tab1 union all select count(*) Count_2 from schema.tab2

Tapi yang saya miliki adalah:

Count_1
123
456

Jawaban:


328
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual

14
kenapa kamu butuh dual? apa artinya?
— Ray Lu

31
Ini meja palsu dengan satu catatan. Anda tidak dapat memiliki SELECT tanpa FROM di Oracle.
— Quassnoi

3
ganda adalah tabel di oracle db Ini yang semua account dapat mengakses Anda dapat menggunakannya untuk kebutuhan umum seperti: "sysdate SELECT FROM ganda"
— dincerm

5
Tidak ada bedanya, Oracle tidak akan mengevaluasi apa pun di dalam COUNT (*).
— Quassnoi

4
@ Stéphane: ini terjadi ketika Anda mencoba kode Oracle pada PostgreSQL. Kalah FROM dual.
— Quassnoi

81

Sebagai informasi tambahan, untuk mencapai hal yang sama di SQL Server, Anda hanya perlu menghapus bagian "FROM dual" dari kueri.


1
Saya baru saja siap untuk mengatakan, "Tetapi bagaimana dengan MS SQL, ketika saya melihat komentar Anda. Terima kasih telah mengantisipasi kebutuhan!
— Andrew Neely

40

Hanya karena ini sedikit berbeda:

SELECT 'table_1' AS table_name, COUNT(*) FROM table_1
UNION
SELECT 'table_2' AS table_name, COUNT(*) FROM table_2
UNION
SELECT 'table_3' AS table_name, COUNT(*) FROM table_3

Ini memberikan jawaban ditransformasikan (satu baris per tabel, bukan satu kolom), kalau tidak saya tidak berpikir itu jauh berbeda. Saya pikir kinerja-bijaksana mereka harus setara.


1
Anda sebaiknya meletakkan SEMUA UNION di sini.
— Quassnoi

Apa bedanya menambahkan "ALL" dengan tiga kueri baris tunggal? Hasilnya pasti sama, bukan?
— Mike Woodhouse

1
UNION tanpa SEMUA hasil grup. Jika ada 2 baris di table_1 dan table_2, dan 3 baris di table_3, Anda akan mendapatkan dua baris di resultset Anda, dan tidak akan dapat memberi tahu dari resultset berapa banyak baris yang dimiliki table_2: 2 atau 3.
— Quassnoi

4
Ya, tapi saya memilih nama tabel, yang membuat hasilnya unik. Kalau tidak, Anda akan benar, tetapi berapa nilainya dalam beberapa angka tanpa konteks? ;-)
— Mike Woodhouse

Ini juga merupakan cara yang baik untuk menggunakan pernyataan CTE (WITH SELECT) untuk setiap hitungan.
— blue_chip

28

Pengalaman saya dengan SQL Server, tetapi bisa Anda lakukan:

select (select count(*) from table1) as count1,
  (select count(*) from table2) as count2

Di SQL Server saya mendapatkan hasil yang Anda cari.


11

Metode lain yang sedikit berbeda:

with t1_count as (select count(*) c1 from t1),
     t2_count as (select count(*) c2 from t2)
select c1,
       c2
from   t1_count,
       t2_count
/

select c1,
       c2
from   (select count(*) c1 from t1) t1_count,
       (select count(*) c2 from t2) t2_count
/

7

Karena saya tidak dapat melihat jawaban lain apa pun yang mengangkat ini.

Jika Anda tidak suka sub-kueri dan memiliki kunci utama di setiap tabel, Anda bisa melakukan ini:

select count(distinct tab1.id) as count_t1,
       count(distinct tab2.id) as count_t2
    from tab1, tab2

Tapi kinerja bijaksana saya percaya bahwa solusi Quassnoi lebih baik, dan yang saya gunakan.


7

SELECT (SELECT COUNT(*) FROM table1) + (SELECT COUNT(*) FROM table2) FROM dual;


7

Ini dari saya untuk dibagikan

Opsi 1 - menghitung dari domain yang sama dari tabel yang berbeda

select distinct(select count(*) from domain1.table1) "count1", (select count(*) from domain1.table2) "count2" 
from domain1.table1, domain1.table2;

Opsi 2 - menghitung dari domain yang berbeda untuk tabel yang sama

select distinct(select count(*) from domain1.table1) "count1", (select count(*) from domain2.table1) "count2" 
from domain1.table1, domain2.table1;

Opsi 3 - menghitung dari domain yang berbeda untuk tabel yang sama dengan "gabungan semua" untuk memiliki baris hitungan

select 'domain 1'"domain", count(*) 
from domain1.table1 
union all 
select 'domain 2', count(*) 
from domain2.table1;

Nikmati SQL, saya selalu melakukan :)


7
    select 
    t1.Count_1,t2.Count_2
    from 
(SELECT count(1) as Count_1 FROM tab1) as t1, 
(SELECT count(1) as Count_2 FROM tab2) as t2

6
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;

6

Tusukan cepat muncul dengan:

Select (select count(*) from Table1) as Count1, (select count(*) from Table2) as Count2

Catatan: Saya menguji ini dalam SQL Server, jadi From Dualtidak perlu (maka perbedaannya).


5

Untuk sedikit kelengkapan - kueri ini akan membuat kueri untuk memberi Anda jumlah semua tabel untuk pemilik tertentu.

select 
  DECODE(rownum, 1, '', ' UNION ALL ') || 
  'SELECT ''' || table_name || ''' AS TABLE_NAME, COUNT(*) ' ||
  ' FROM ' || table_name  as query_string 
 from all_tables 
where owner = :owner;

Outputnya seperti

SELECT 'TAB1' AS TABLE_NAME, COUNT(*) FROM TAB1
 UNION ALL SELECT 'TAB2' AS TABLE_NAME, COUNT(*) FROM TAB2
 UNION ALL SELECT 'TAB3' AS TABLE_NAME, COUNT(*) FROM TAB3
 UNION ALL SELECT 'TAB4' AS TABLE_NAME, COUNT(*) FROM TAB4

Yang kemudian bisa Anda jalankan untuk mendapatkan jumlah Anda. Ini hanya skrip yang berguna untuk berkeliling.


4

Jika tabel (atau setidaknya kolom kunci) dari jenis yang sama, buat serikat terlebih dahulu, lalu hitung.

select count(*) 
  from (select tab1key as key from schema.tab1 
        union all 
        select tab2key as key from schema.tab2
       )

Atau ambil satement Anda dan letakkan jumlah lain () di sekitarnya.

select sum(amount) from
(
select count(*) amount from schema.tab1 union all select count(*) amount from schema.tab2
)

3
--============= FIRST WAY (Shows as Multiple Row) ===============
SELECT 'tblProducts' [TableName], COUNT(P.Id) [RowCount] FROM tblProducts P
UNION ALL
SELECT 'tblProductSales' [TableName], COUNT(S.Id) [RowCount] FROM tblProductSales S


--============== SECOND WAY (Shows in a Single Row) =============
SELECT  
(SELECT COUNT(Id) FROM   tblProducts) AS ProductCount,
(SELECT COUNT(Id) FROM   tblProductSales) AS SalesCount

2
Declare @all int
SET @all = (select COUNT(*) from tab1) + (select count(*) from tab2)
Print @all

atau

SELECT (select COUNT(*) from tab1) + (select count(*) from tab2)

0

GABUNG dengan tabel berbeda

SELECT COUNT(*) FROM (  
SELECT DISTINCT table_a.ID  FROM table_a JOIN table_c ON table_a.ID  = table_c.ID   );

0

pilih (pilih count ( ) dari tab1 di mana fieldlike 'value') + (pilih count ( ) dari tab2 di mana fieldlike 'value') count


-2
select @count = sum(data) from
(
select count(*)  as data from #tempregion
union 
select count(*)  as data from #tempmetro
union
select count(*)  as data from #tempcity
union
select count(*)  as data from #tempzips
) a

Selamat datang di StackOverflow dan terima kasih telah memposting. Silakan lihat Cara Menjawab .
— Serge Belov

Jawaban ini salah. Tidak dapat menggunakan gabungan (harus menggunakan gabungan semua).
— Deadsheep39
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.