2009-03-10 16 views
8

में एक अस्थायी कॉलम का उपयोग कैसे करें, जहां मैं खंड में अस्थायी कॉलम का उपयोग क्यों नहीं कर सकता?जहां खंड

उदाहरण के लिए

, इस क्वेरी:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
    1 
GROUP BY 
    product_brand 

यह दो कॉलम, एक बुलाया product_brand और एक brand_count कहा जाता है को लाता है। brand_count फ्लाई पर बनाया गया है और उस ब्रांड के साथ 50 या उत्पाद के आधार पर हमेशा 1 या 0 है।

यह सब

, मेरे लिए समझ में आता है, सिवाय इसके कि मैं नीचे इस क्वेरी में के रूप में ही अगर brand_count = 1 चयन नहीं कर सकते:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM 
    products 
WHERE 
    brand_count = 1 
GROUP BY 
    product_brand 

जो मुझे इस त्रुटि देता है:

#1054 - Unknown column 'brand_count' in 'where clause' 

उत्तर

13

उपयोग HAVING बजाय:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
    FROM products 
    GROUP BY product_brand 
    HAVING brand_count = 1 

WHEREGROUP BY से पहले मूल्यांकन किया जाता है। HAVING के बाद मूल्यांकन किया जाता है।

+0

आप गलत हैं। यह भी हैविंग में काम नहीं करता है। – thorn

+0

@thorn: यह हमेशा मेरे लिए MySQL में काम करता है। शायद आपकी क्वेरी में कुछ और गलत है? MySQL का कौन सा संस्करण आप चल रहे हैं, और क्या आपके पास सख्त विकल्प सक्षम हैं? – derobert

+0

क्षमा करें। मैंने एमएस एसक्यूएल सर्वर के साथ MySQL उलझन में है। – thorn

0

क्योंकि यह है प्रसंस्करण करने के बाद तक यह नहीं पता कि कॉलम क्या है।

यदि आप उस नाम से कॉलम तक पहुंचना चाहते हैं तो आपको एक सबक्वायरी का उपयोग करना होगा, अन्यथा आपको बिना दिए गए नाम के कॉलम को अर्हता प्राप्त करनी होगी, अपना केस स्टेटमेंट दोहराएं।

2

क्योंकि एसक्यूएल में कॉलम पहले "चुने गए" और फिर "अनुमानित" होते हैं।

+0

यह समझाते हुए मेरे प्रयास से कहीं अधिक संक्षिप्त है :) – TheTXI

+0

धन्यवाद TheTXI: पी, अंत में भुगतान किए गए डीबी डिजाइन पाठ्यक्रमों के लिए फेंक दें। –

2

पूर्ण खंड का उपयोग करना है, तो आप की आवश्यकता होगी:

Select 
    product_brand, 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) AS brand_count 
FROM products 
WHERE 
    (CASE WHEN COUNT(product_brand)>50 THEN 1 ELSE 0 END) = 1 
GROUP BY product_brand 

यह किसी भी SQL विवरण में किसी भी गणना क्षेत्र के लिए एक ही है।

आसान बनाने के लिए:

Select Max(Points) as Highest where Highest > 10 

काम नहीं करेगा, लेकिन:

Select Max(Points) as Highest where Max(Points) > 10 

इच्छा। यह आपके मामले में वही है।

0

अगर मैं अपने इरादे सही ढंग से पढ़ा, तो आप इस क्वेरी को पढ़ने के लिए फिर से लिख सकते हैं:

Select 
product_brand, 
COUNT(product_brand) AS brand_count 
FROM 
products 
GROUP BY 
product_brand 
HAVING 
COUNT(product_brand) > 50 

यह है कि एक count > 50 और भी आप प्रत्येक के लिए संख्या दिखाएंगे आप सभी product_brands दे देंगे।

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