जहाँ> गिनती> 1 रिकॉर्ड खोजने के लिए SQL क्वेरी


176

मेरे पास एक टेबल है जिसका नाम है PAYMENT। इस तालिका के भीतर मेरे पास एक उपयोगकर्ता आईडी, एक खाता संख्या, एक ज़िप कोड और एक तारीख है। मैं उन सभी उपयोगकर्ताओं के लिए सभी रिकॉर्ड ढूंढना चाहूंगा जिनके पास एक ही खाता संख्या के साथ प्रति दिन एक से अधिक भुगतान है।

UPDATE: इसके अतिरिक्त, केवल एक फिल्टर होना चाहिए जो रिकॉर्ड्स को गिनता है जिसका ज़िप कोड अलग है।

इस तरह तालिका दिखती है:

| user_id | account_no | ज़िप | तारीख |
| 1 | 123 | 55555 | 12-DEC-09 |
| 1 | 123 | 66666 | 12-DEC-09 |
| 1 | 123 | 55555 | 13-DEC-09 |
| 2 | 456 | 77777 | 14-DEC-09 |
| 2 | 456 | 77777 | 14-DEC-09 |
| 2 | 789 | 77777 | 14-DEC-09 |
| 2 | 789 | 77777 | 14-DEC-09 |

परिणाम इस तरह दिखना चाहिए:

| user_id | गिनती |
| 1 | 2 |

आप इसे SQL क्वेरी में कैसे व्यक्त करेंगे? मैं स्वयं शामिल होने के बारे में सोच रहा था लेकिन किसी कारण से मेरी गिनती गलत है।

जवाबों:


345

पंक्ति को विशिष्ट बनाने वाले फ़ील्ड द्वारा HAVING क्लॉज़ और GROUP का उपयोग करें

नीचे मिलेगा

सभी उपयोगकर्ता जिनके पास एक ही खाता संख्या के साथ प्रति दिन एक से अधिक भुगतान हैं

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

अद्यतन यदि आप केवल उन लोगों को शामिल करना चाहते हैं जिनके पास एक अलग ज़िप है, तो आप पहले एक अलग सेट प्राप्त कर सकते हैं और फिर आपको HAVING / GROUP प्रदर्शन कर सकते हैं

 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
उनके परिणामों 2की सूचना में एक गिनती है 4- आप Account_noमेरे विचार से समूहीकरण को त्यागना चाहेंगे ।
JNK

कोई प्रतीक्षा नहीं मुझे लगता है कि मूल सही था "सभी उपयोगकर्ता जिनके पास एक ही खाता संख्या के साथ प्रति दिन एक से अधिक भुगतान है।"
कॉनराड फ्रैक्स

यह कहता है कि लेकिन उसके परिणाम अन्यथा दिखाई देते हैं। हो सकता है कि नोट के साथ दोनों संस्करण हों।
JNK

आपकी प्रतिक्रियाओं के लिए धन्यवाद। मुझे लगता है कि यह करना चाहिए। यदि मैं अब एक और फ़िल्टर जोड़ना चाहता था जो यह जाँचता है कि बिलिंग ज़िप कोड (एक ही तालिका, अलग कॉलम) एक ही तिथि के लिए अलग है तो मैं इस क्वेरी को कैसे संशोधित करूँगा?
बेंजामिन मस्को

मैं नमूना आउटपुट को हल नहीं कर सकता। यदि हम खाता छोड़ देते हैं, तो हमें तीन पंक्तियाँ मिलेंगी। अगर हम तारीख और खाता दोनों छोड़ देते हैं तो हमें 1,3 और 2,4 दो पंक्तियाँ मिलेंगी। तो मैं आगे बढ़ने जा रहा हूं और आउटपुट पर शब्दों पर भरोसा कर रहा हूं
कॉनरेड फ्रीक्स

43

इस प्रश्न को आज़माएं:

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

4
साफ है, लेकिन यह इस सवाल का जवाब नहीं देता है
लैम्बर्ट

4

मैं HAVINGnewbies के लिए कीवर्ड की सिफारिश नहीं करूंगा , यह अनिवार्य रूप से विरासत के उद्देश्यों के लिए है

इस तालिका की कुंजी क्या है (क्या यह पूरी तरह से सामान्य है , मुझे आश्चर्य है?), मैं स्पष्ट नहीं हूं, परिणामस्वरूप मुझे आपके विनिर्देश का पालन करना मुश्किल लगता है:

मैं उन सभी उपयोगकर्ताओं के लिए सभी रिकॉर्ड ढूंढना चाहूंगा जिनके पास एक ही खाता संख्या के साथ प्रति दिन एक से अधिक भुगतान है ... इसके अतिरिक्त, केवल उन रिकॉर्डों की गणना करना चाहिए जिनके ज़िप कोड अलग हैं।

इसलिए मैंने शाब्दिक व्याख्या ली है।

निम्नलिखित अधिक क्रिया है लेकिन समझने में आसान हो सकता है और इसलिए बनाए रखना चाहिए (मैंने तालिका के लिए सीटीई का उपयोग किया है PAYMENT_TALLIESलेकिन यह एक हो सकता है 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;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.