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
pengguna73118
sumber

Jawaban:

328
SELECT  (
        SELECT COUNT(*)
        FROM   tab1
        ) AS count1,
        (
        SELECT COUNT(*)
        FROM   tab2
        ) AS count2
FROM    dual
Quassnoi
sumber
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.

dincerm
sumber
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.

Mike Woodhouse
sumber
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.

Nic Wise
sumber
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
/
David Aldridge
sumber
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.

Jimmy Stenke
sumber
7

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

casperOne
sumber
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 :)

Fadzil
sumber
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
Vikas Kumar
sumber
6
select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
Jens Schauder
sumber
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).

CJM
sumber
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.

Chris Gill
sumber
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
)

sumber
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
Sheikh Kawser
sumber
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)
Rabby Hasan
sumber
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   );
zloctb
sumber
0

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

Cris
sumber
-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
sajid
sumber
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