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.