Sayı ve grup aynı select deyiminde nasıl kullanılır


223

Bir grup tarafından bir sql seçme sorgusu var. Gruptan sonraki tüm kayıtları ifadeye göre saymak istiyorum. Bunun doğrudan sql'den bir yolu var mı? Örneğin, kullanıcılarla bir tabloya sahip olmak için farklı şehirleri ve toplam kullanıcı sayısını seçmek istiyorum

select town, count(*) from user
group by town

Tüm kasabalarda bir sütun ve tüm satırlarda kullanıcı sayısı ile başka bir sütun istiyorum.

Toplamda 3 kasaba ve 58 kullanıcıya sahip olmanın sonucuna bir örnek:

Town         Count
Copenhagen   58
NewYork      58
Athens       58

sonuç kümenizin bir kasaba ve bir kullanıcı için 2 sayım olmasını mı istiyorsunuz?
Leslie

2
Yani her kasaba için bir satır istiyorsunuz ve her satırda sütun 2 tüm kullanıcıların toplam sayısını içeriyor mu? Sütun 2 her satır için aynı değere sahip mi? Örnek verileri ve gerekli çıktıyı içerecek şekilde düzenlerseniz, size tam olarak ne istediğinizi verebiliriz.
AakashM

Haklısın AakashM! Az önce düzenledim.
Stavros


1
Okuyucular için uyarı: Yanıtların çoğu, sorgu için güncellenmiş olarak yanıt verememektedir.
Rick James

Yanıtlar:


271

Bu istediğinizi yapar (her biri kullanıcı sayısı ile şehirler listesi):

select town, count(town) 
from user
group by town

Çoğu toplama işlevini kullanırken kullanabilirsiniz GROUP BY.

Güncelleme (soru ve yorumlarda yapılan değişikliği takiben)

Kullanıcı sayısı için bir değişken bildirebilir ve bunu kullanıcı sayısına ayarlayabilirsiniz, ardından bununla seçim yapabilirsiniz.

DECLARE @numOfUsers INT
SET @numOfUsers = SELECT COUNT(*) FROM user

SELECT DISTINCT town, @numOfUsers
FROM user

OP tam olarak bunu yazdı mı? nvm, farkınızı görüyorum, Kasaba değil sayıyorsunuz * ....
Leslie

@Leslie - iki sorgu arasında fark yoktur. Aynı sonuç kümesini döndürürler. Ben sadece kullanımı sevmiyorum *... OP kendi sorusunu yanıtladı, ama test bile görünmüyordu, ben sadece doğru olduğunu onaylıyorum
Oded

Yine umduğum gibi değil, ama bu en iyi çözüm gibi görünüyor ..;) Teşekkürler
Stavros

149

Şunları kullanabilirsiniz COUNT(DISTINCT ...):

SELECT COUNT(DISTINCT town) 
FROM user

3
bir cazibe olarak çalışır ... ana cevap seçilmelidir .. Bunun iyi olmadığını bazı prob dışında.
Victor

2
WHERE yan tümcesinde COUNT (DISTINCT kasaba) koymak demek düşünüyorum. Bunun nedeni, toplu bir işlev olması ve HAVING deyiminde sağlanması gerektiğidir. SELECT COUNT (DISTINCT kasabası) hem COUNT hem de DISTINCT anahtar kelimeleri nedeniyle örtülü bir GROUP BY'ye dönüştüğünden bu SQL sorgusu bazılarına yanıltıcıdır, her bir anahtar kelime kendi başına dolaylı olarak gruplanır.
A.Graensmith

Teşekkürler. Oyla. Tam olarak ne gerekli - grup + bir op içinde sayın ve sonuçta tek bir satır alın.
Yeşil

Kahretsin .. Bunun mümkün olduğunu bilmiyordum!
Hugo S. Mendes

1
@milkovsky - Hayır, silmek zorunda değilsin. Sadece bu sorunun artı birçok cevabın iki farklı problemi çözmek için çatallandığını tahriş edici buluyorum . Cevabınız iki şekilde sapıyor - townsütun yok ve COUNTsyanlış şey (kullanıcı yerine kasaba).
Rick James

37

Diğer yol:

/* Number of rows in a derived table called d1. */
select count(*) from
(
  /* Number of times each town appears in user. */
  select town, count(*)
  from user
  group by town
) d1

5
takma ihtiyacı aksi takdirde mysql çalışmaz. () agr
amas

5

Silinmemiş on cevap; En do not kullanıcı istedi yap. Cevapların çoğu, her şehirde toplam 58 yerine 58 kullanıcı olduğunu düşünerek soruyu yanlış okudu . Doğru olan birkaç kişi bile uygun değildir.

mysql> flush status;
Query OK, 0 rows affected (0.00 sec)

SELECT  province, total_cities
    FROM       ( SELECT  DISTINCT province  FROM  canada ) AS provinces
    CROSS JOIN ( SELECT  COUNT(*) total_cities  FROM  canada ) AS tot;
+---------------------------+--------------+
| province                  | total_cities |
+---------------------------+--------------+
| Alberta                   |         5484 |
| British Columbia          |         5484 |
| Manitoba                  |         5484 |
| New Brunswick             |         5484 |
| Newfoundland and Labrador |         5484 |
| Northwest Territories     |         5484 |
| Nova Scotia               |         5484 |
| Nunavut                   |         5484 |
| Ontario                   |         5484 |
| Prince Edward Island      |         5484 |
| Quebec                    |         5484 |
| Saskatchewan              |         5484 |
| Yukon                     |         5484 |
+---------------------------+--------------+
13 rows in set (0.01 sec)

SHOW session status LIKE 'Handler%';

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Handler_commit             | 1     |
| Handler_delete             | 0     |
| Handler_discover           | 0     |
| Handler_external_lock      | 4     |
| Handler_mrr_init           | 0     |
| Handler_prepare            | 0     |
| Handler_read_first         | 3     |
| Handler_read_key           | 16    |
| Handler_read_last          | 1     |
| Handler_read_next          | 5484  |  -- One table scan to get COUNT(*)
| Handler_read_prev          | 0     |
| Handler_read_rnd           | 0     |
| Handler_read_rnd_next      | 15    |
| Handler_rollback           | 0     |
| Handler_savepoint          | 0     |
| Handler_savepoint_rollback | 0     |
| Handler_update             | 0     |
| Handler_write              | 14    |  -- leapfrog through index to find provinces  
+----------------------------+-------+

OP bağlamında:

SELECT  town, total_users
    FROM       ( SELECT  DISTINCT town  FROM  canada ) AS towns
    CROSS JOIN ( SELECT  COUNT(*) total_users  FROM  canada ) AS tot;

Sadece bir satır totolduğundan CROSS JOIN, aksi halde olabileceği kadar hacimli değildir.

Her zamanki desen COUNT(*)yerine COUNT(town). İkincisi town, bu bağlamda gereksiz olan null olup olmadığını kontrol etmeyi gerektirir .


4

Oracle ile analitik işlevleri kullanabilirsiniz:

select town, count(town), sum(count(town)) over () total_count from user
group by town

Diğer seçenekleriniz bir alt sorgu kullanmaktır:

select town, count(town), (select count(town) from user) as total_count from user
group by town

sonuncusu gibi bir şey işe yarayacağını, ancak başka bir çözüm olup olmadığını görmek istedim ..
Stavros

Ve ilk (analitik fonksiyon) seçeneğini kullanamaz mısınız? Hangi veritabanı platformunu kullanıyorsunuz?
Tommi

@Stavros: Sonuncusu yavaş
Michael Buen

4

Sayımla sipariş vermek istiyorsanız (basit ses ama bunu nasıl yapacağınıza dair bir cevap bulamıyorum) şunları yapabilirsiniz:

        SELECT town, count(town) as total FROM user
        GROUP BY town ORDER BY total DESC

2

DISTINCT'i, milkovsky'nin söylediği gibi COUNT içinde kullanabilirsiniz

benim durumumda:

select COUNT(distinct user_id) from answers_votes where answer_id in (694,695);

Bu, bir kullanıcı ile aynı user_id olarak kabul edilen cevap oylarının sayısını çeker


2

Bu SQL Server eski bir yazı olduğunu biliyorum:

select  isnull(town,'TOTAL') Town, count(*) cnt
from    user
group by town WITH ROLLUP

Town         cnt
Copenhagen   58
NewYork      58
Athens       58
TOTAL        174

5
Eski mesajları cevaplamakta yanlış bir şey yoktur. Ancak, lütfen kodunuzun açıklamasını ve kodun kendisini de ekleyin.
Shelvacu

MySQL eşdeğeri ( IFNULLyerine ISNULL) her kasaba için farklı numaralara yol açar; kullanıcı toplamı istedi. Soruya göre, toplam 174 değil, 58'dir.
Rick James

1

İlçe ve toplam kullanıcı sayısını seçmek istiyorsanız, aşağıdaki bu sorguyu kullanabilirsiniz:

SELECT Town, (SELECT Count(*) FROM User) `Count` FROM user GROUP BY Town;

Bu, (belki de makul bir şekilde) içinde yinelenen "kullanıcı" olmadığını varsayar User.
Rick James

1

Sayım Seçmeli Tüm Sorgu Seç seçeneğini kullanmak istiyorsanız, şunu deneyin ...

 select a.*, (Select count(b.name) from table_name as b where Condition) as totCount from table_name  as a where where Condition

Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Uygun bir açıklama , bunun neden problem için iyi bir çözüm olduğunu göstererek uzun vadeli değerini büyük ölçüde artıracak ve diğer benzer sorularla gelecekteki okuyucular için daha yararlı hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
Toby Speight

0

Aşağıdaki kodu deneyin:

select ccode, count(empno) 
from company_details 
group by ccode;

her bir kodda (şirket kodu) her günkü hesap için toplam çalışan sayısını bulmak için bu kodu kullanırız: count (empno), kod 1 için 1839 ve count (empno), 47
kod
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.