2011-10-31 8 views
11

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

मुझे बिक्री पर होने पर उत्पाद की छूट की गणना करने की भी आवश्यकता है। इसे करने से पहले, कृपया मेरे मौजूदा एसक्यूएल का टूटना देखें जो काम करता है।

SELECT p.productid, p.stylename, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price 

FROM product p, ... etc. 

ऊपर कोड काम करता है (मैं इसे सरल बनाया है), और मूल रूप से, उत्पाद की मूल कीमत "final_original_price" कॉलम उर्फ ​​में संग्रहीत किया जाता है, और बिक्री मूल्य (जो शून्य हो सकता है) के रूप में दिया जाता है "final_sale_price"।

अब मैं छूट प्राप्त करने के लिए चयन में एक अतिरिक्त पंक्ति जोड़ना चाहता हूं। मैं वास्तविक तालिका में मौजूदा फ़ील्ड का उपयोग नहीं कर सकता क्योंकि मैं गणना करने के लिए "final_original_price" और "final_sale_price" के उन वापसी मानों को चाहता हूं।

उदा

SELECT p.productid, p.stylename, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price, 

((final_original_price - final_sale_price)/final_original_price * 100) AS final_discount_percentage 

FROM product p, ... etc. 

ऊपर काम नहीं करता है, के रूप में Postgresql रिटर्न "त्रुटि: स्तंभ" final_original_price "चरित्र पर मौजूद नहीं है ....."

तो, स्पष्ट रूप से मैं के रिटर्न मान उपयोग नहीं कर सकते मुकदमा। मेरे समाधान का उपयोग करने के लिए मेरे प्रश्न:

1) क्या मैं वास्तव में इस मामले के वापसी मूल्य का उपयोग कर सकता हूं जैसे मैं ऊपर करना चाहता हूं? या 2) क्या मुझे फिर से मेरी गणना में केस स्टेटमेंट प्लग करने की आवश्यकता है? इसका मतलब है कि मुझे केस कोड दोहराना होगा और क्वेरी काफी लंबा दिखाई देगी। अगर मुझे करना है, तो मैं यह करूँगा, लेकिन मैं सोच रहा हूं कि कोई बेहतर तरीका है या नहीं। या 3) मैं डिस्काउंट को स्टोर करने के लिए डेटाबेस में एक अतिरिक्त फ़ील्ड भी स्टोर कर सकता हूं। यह डेटा अनावश्यक होगा क्योंकि मेरे सीएमएस को यह सुनिश्चित करने की आवश्यकता होगी कि कीमत अपडेट होने पर फ़ील्ड अपडेट हो। हालांकि यह फ्रंट एंड पर (यदि उपर्युक्त भारी माना जाता है) को बचाएगा जो बैकएंड सीएमएस की तुलना में अधिक बार चलता है।

उपरोक्त समाधान शायद सबसे आसान हैं, लेकिन मैं भी सोच रहा हूं, अगर मेरे पास ऐसा करने का समय था, तो क्या कोई अन्य समाधान यहां पर विचार करने योग्य होगा? उदाहरण के लिए यह "दृश्य" लिखने के लिए एक अच्छा परिदृश्य होगा? व्यक्तिगत रूप से मैंने कभी भी एक दृश्य स्थापित नहीं किया है और जहां तक ​​मैं समझता हूं, डेटाबेस-चयन कार्य अभी भी पृष्ठभूमि में हो रहा है, लेकिन, यदि सेट अप किया गया है, तो डेवलपर के दृष्टिकोण से समझने के लिए अंत क्वेरी को सरल से ऊपर कर देगा।

बहुत धन्यवाद!

+3

कृपया ध्यान दें, कि आपकी समस्या का 'केस' से कोई लेना देना नहीं है। यह SQL की एक सामान्य समस्या है क्योंकि आप इस न्यूनतम उदाहरण में देख सकते हैं: 'SELECT 42 AS x, 12 AS y, x * y AS z'। यह एक ही त्रुटि पैदा करता है। –

उत्तर

14

उपयोग

SELECT 
productid, 
stylename, 
final_original_price, 
final_sale_price, 
((final_original_price - final_sale_price)/final_original_price * 100) AS final_discount_percentage 
FROM 
(
SELECT p.productid, p.stylename, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.original_price ELSE pp.original_price END AS final_original_price, 
CASE WHEN (ppo.original_price IS NOT NULL) THEN ppo.sale_price ELSE pp.sale_price END AS final_sale_price 
FROM product p, ... etc. 
) 

ऊपर वास्तव में क्या आप के लिए ... पूछा करता है अगर किसी कारण आप यह तो (अपने प्रश्न से विकल्प 2) गणना में CASE बयान प्लगइन का उपयोग नहीं करना चाहते हैं के लिए ।

+0

शानदार! धन्यवाद!! मैं अभी के लिए चयन सबक्वायरी का उपयोग करूंगा। – rishijd

+0

आपका स्वागत है :-) कृपया सहायता के किसी भी उत्तर को स्वीकृत के रूप में अपवर्तित/चिह्नित करना न भूलें! – Yahia

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