Sayısı> 1 bulmak için SQL sorgusu


176

Adında bir masam var PAYMENT . Bu tabloda bir kullanıcı kimliğim, bir hesap numarası, bir posta kodu ve bir tarih var. Aynı hesap numarasıyla günde birden fazla ödeme yapan tüm kullanıcılar için tüm kayıtları bulmak istiyorum.

GÜNCELLEME: Ayrıca, yalnızca ZIP kodu farklı olan kayıtları sayan bir filtre olmalıdır.

Tablo şöyle görünür:

| kullanıcı_kimliği | account_no | zip | tarih |
| 1 | 123 | 55555 | 12-ARA-09 |
| 1 | 123 | 66666 | 12-ARA-09 |
| 1 | 123 | 55555 | 13-ARA-09 |
| 2 | 456 | 77777 | 14-ARA-09 |
| 2 | 456 | 77777 | 14-ARA-09 |
| 2 | 789 | 77777 | 14-ARA-09 |
| 2 | 789 | 77777 | 14-ARA-09 |

Sonuç şuna benzer olmalıdır:

| kullanıcı_kimliği | sayısı |
| 1 | 2 |

Bunu bir SQL sorgusunda nasıl ifade edersiniz? Kendime katılmayı düşünüyordum ama nedense sayım yanlış.

Yanıtlar:


345

HAVING yan tümcesini ve GROUP satırını benzersiz yapan alanları kullanın

Aşağıdaki bulacaksınız

aynı hesap numarasıyla günde birden fazla ödeme yapan tüm kullanıcılar

SELECT 
 user_id ,
 COUNT(*) count
FROM 
 PAYMENT
GROUP BY
 account,
 user_id ,
 date
Having
COUNT(*) > 1

Güncelleme Yalnızca farklı bir ZIP'e sahip olanları dahil etmek istiyorsanız, önce farklı bir set alabilir ve ardından HAVING / GROUP BY ile gerçekleştirebilirsiniz.

 SELECT 
    user_id,
    account_no , 
    date,
        COUNT(*)
 FROM
    (SELECT DISTINCT
            user_id,
            account_no , 
            zip, 
            date
         FROM
            payment 

        ) 
        payment
 GROUP BY

    user_id,
    account_no , 

    date
HAVING COUNT(*) > 1

1
Sonuçlarında dikkat edilmesi gereken 2bir sayı var 4- Account_noSanırım gruplamayı atmak isteyeceksiniz .
JNK

Bekle, orijinal "doğru hesap numarası ile günde birden fazla ödeme olan tüm kullanıcılar" haklı olduğunu düşünüyorum.
Conrad Frix

diyor ama sonuçları aksini gösteriyor. Belki her iki sürümü de bir notla.
JNK

Yanıtlarınız için teşekkürler. Bence bunu yapmalı. Şimdi faturalandırma posta kodunun (aynı tablo, farklı sütun) aynı tarih için farklı olup olmadığını kontrol eden başka bir filtre eklemek istersem bu sorguyu nasıl değiştirebilirim?
Benjamin Muschko

Örnek çıktıyı çözemiyorum. Hesabı düşürürsek, üç satır alırdık. Hem tarihi hem de hesabı düşürürsek iki satır 1,3 ve 2,4 alırız. Bu yüzden çıkacağım ve sözlerin çıktısı üzerine güveneceğim
Conrad Frix

43

Bu sorguyu deneyin:

SELECT column_name
  FROM table_name
 GROUP BY column_name
HAVING COUNT(column_name) = 1;

4
temiz, ama bu soruya cevap vermiyor
Lambart

4

HAVINGAnahtar kelimeyi yeni başlayanlar için tavsiye etmem, esasen eski amaçlar içindir .

Bu tablonun anahtarının ne olduğu konusunda net değilim ( tamamen normalleştirilmiş mi, merak ediyorum?), Sonuç olarak şartnamenizi takip etmeyi zor buluyorum:

Aynı hesap numarasıyla günde birden fazla ödeme yapan tüm kullanıcılar için tüm kayıtları bulmak istiyorum ... Ayrıca, yalnızca posta kodu farklı olan kayıtları sayan bir filtre olmalı.

Böylece gerçek bir yorum aldım.

Aşağıdakiler daha ayrıntılıdır, ancak anlaşılması ve dolayısıyla bakımı daha kolay olabilir ( tablo için bir CTE kullandım, PAYMENT_TALLIESancak bir VIEW:

WITH PAYMENT_TALLIES (user_id, zip, tally)
     AS
     (
      SELECT user_id, zip, COUNT(*) AS tally
        FROM PAYMENT
       GROUP 
          BY user_id, zip
     )
SELECT DISTINCT *
  FROM PAYMENT AS P
 WHERE EXISTS (
               SELECT * 
                 FROM PAYMENT_TALLIES AS PT
                WHERE P.user_id = PT.user_id
                      AND PT.tally > 1
              );

2
create table payment(
    user_id int(11),
    account int(11) not null,
    zip int(11) not null,
    dt date not null
);

insert into payment values
(1,123,55555,'2009-12-12'),
(1,123,66666,'2009-12-12'),
(1,123,77777,'2009-12-13'),
(2,456,77777,'2009-12-14'),
(2,456,77777,'2009-12-14'),
(2,789,77777,'2009-12-14'),
(2,789,77777,'2009-12-14');

select foo.user_id, foo.cnt from
(select user_id,count(account) as cnt, dt from payment group by account, dt) foo
where foo.cnt > 1;
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.