2015-11-25 6 views
5

यदि समाधान स्पष्ट होना चाहिए तो इस प्रश्न के लिए अग्रिम में क्षमा करें। मैंने खोज की है लेकिन अभी तक कोई समाधान नहीं मिला है।उसी तालिका में शामिल होने के साथ एसक्यूएल गिनती क्वेरी

मेरे पास एक ऑर्डर तालिका है जिसमें 2 कॉलम शामिल हैं: कस्टिड और उत्पाद ब्रैंड। उत्पाद ब्रैंड आदेश दिया गया आइटम का बना है, उदा। सोनी, एचपी, डेल, आदि

मैं उन ग्राहकों की सूची प्राप्त करना चाहता हूं जिन्होंने उत्पादब्रांड = सोनी के साथ कम से कम 10 आइटम का आदेश दिया है लेकिन उत्पादब्रांड = एचपी के साथ 5 से कम आइटम का आदेश दिया है।

क्या मैं इन पंक्तियों के साथ कुछ कर सकता हूं?

SELECT o1.CustID 
FROM Orders o1 HAVING COUNT(o1.ProductBrand="Sony") >= 10 
INNER JOIN Orders o2 ON o1.CustID = o2.CustID 
HAVING COUNT(o2.ProductBrand="HP") < 5; 
+0

क्वेरी से आपका परिणाम क्या था? .. – tharif

+0

विवरण में दिए गए प्रश्न को वास्तव में SQL पार्सर द्वारा अस्वीकार कर दिया गया है। मैंने बस कुछ विवरण देने के लिए प्रदान किया जो मैं करने की कोशिश कर रहा था। क्षमा करें अगर मैंने यह स्पष्ट नहीं किया। – Point

उत्तर

5

आप एक आत्म में शामिल होने के लिए, बस एकत्रीकरण के बिना यह कर जाएगा:

select o.custid 
from orders o 
group by o.custid 
having sum(case when o.ProductBrand = 'Sony' then 1 else 0 end) >= 10 and 
     sum(case when o.ProductBrand = 'HP' then 1 else 0 end) < 5; 

MySQL में, आप इस सरल बना सकते हैं case को हटाने के द्वारा:

select o.custid 
from orders o 
group by o.custid 
having sum(o.ProductBrand = 'Sony') >= 10 and 
     sum(o.ProductBrand = 'HP') < 5; 
+0

यह काम किया! बहुत बहुत धन्यवाद। अब जब मैं इसे देखता हूं, यह सरल और स्पष्ट दिखता है, लेकिन मुझे इसके बारे में कोई संकेत नहीं पता था। अपनी जानकारी साझा करने के लिए धन्यवाद। – Point

0

सेटअप बेला

CREATE TABLE ORDERS (cust INT, brand VARCHAR(100)) 

INSERT INTO ORDERS VALUES (1, 'Sony') 
INSERT INTO ORDERS VALUES (1, 'Sony') 
INSERT INTO ORDERS VALUES (1, 'Sony') 
INSERT INTO ORDERS VALUES (1, 'Hp') 
INSERT INTO ORDERS VALUES (1, 'Hp') 
INSERT INTO ORDERS VALUES (2, 'Sony') 
INSERT INTO ORDERS VALUES (2, 'Sony') 
INSERT INTO ORDERS VALUES (2, 'Hp') 
INSERT INTO ORDERS VALUES (2, 'Hp') 
INSERT INTO ORDERS VALUES (2, 'Hp') 
INSERT INTO ORDERS VALUES (2, 'Hp') 
INSERT INTO ORDERS VALUES (3, 'Sony') 
INSERT INTO ORDERS VALUES (3, 'Sony') 
INSERT INTO ORDERS VALUES (3, 'Sony') 
INSERT INTO ORDERS VALUES (3, 'Hp') 
INSERT INTO ORDERS VALUES (3, 'Hp') 

क्वेरी

विधि 1

select 
    sony.custId 
from 
    (select cust as custId, Brand, count(*) as count 
    from orders 
    where Brand = 'Sony' 
    group by cust, brand) Sony 
     inner join 
    (select cust as custId, Brand, count(*) as count 
     from orders 
     where Brand = 'Hp' 
     group by cust, brand) Hp 
      on sony.custId = hp.CustId 
Where 
    sony.count > 2 and 
    hp.count < 5 

आप संबंध को समझने के लिए यह अच्छा है। यहाँ एक और तरीका

विधि 2

select cust 
from orders 
group by cust, brand 
having count(case brand when 'Sony' then 'x' end) > 2 and 
     count(case brand when 'Hp' then 'x' end) < 5 

समय लगभग समान है है - यकीन है कि यह डेटा, अनुक्रमित, आदि का प्रयोग करें Sql बेला कार्य योजना लागू करके जांच करने के लिए की मात्रा के आधार पर भिन्न होगी। ऐसा लगता है कि पहली विधि में और चीजें चल रही हैं। लेकिन इसका मतलब यह नहीं है कि जब आप उत्पादन में उपयोग करते हैं, तो यह बहुत खराब होगा।

+0

क्या एक उपयोगी उपकरण है! मैं ऐसा कुछ ढूंढ रहा था - फिडल के बारे में पता लगाना, इस पोस्ट के लायक था। आपकी विधि 1 के साथ मैं अब देखता हूं कि कैसे आंतरिक संयोजन वाक्यविन्यास होना चाहिए - मुझे लगा कि अलग-अलग प्रश्नों को निर्दिष्ट करने के लिए कुछ तरीका होना चाहिए और फिर गिनती तुलना के साथ उनसे जुड़ना चाहिए लेकिन मेरे जैसी समस्याओं के लिए उदाहरण नहीं मिल पाए। टीएस, मैं समाधान प्रदान करने के लिए समय निकालने में आपकी उदारता के लिए धन्यवाद - आशा करता हूं कि आप किसी और के लिए ऐसा करने में सक्षम हों जैसा आपने मेरे लिए किया है। – Point

संबंधित मुद्दे