2013-06-05 6 views
7

मैं एक मुश्किल समय पता लगाना और इसे ठीक करने की कोशिश कर रही है के आधार पर रैंकिंग। क्या आप मुझे तर्क या विचार देने में मदद कर सकते हैं कि बिक्री के आधार पर प्रत्येक शाखा के लिए प्रत्येक श्रेणी की रैंकिंग कैसे प्राप्त की जा सकती है?Mysql श्रेणी और शाखा

enter image description here

enter image description here

उदाहरण के लिए: branch_code_id = 9 के लिए

  • रैंक 1 Accicular है, क्योंकि यह 300,000 बिक्री
  • रैंक 2 branch_code_id के लिए है = 9 WLO है, क्योंकि यह है केवल 200,000 बिक्री।
अन्य शाखाओं के साथ के रूप में एक ही

। मुझे केवल branch_code_id के लिए श्रेणी के रैंक की आवश्यकता है।

मैं समझ नहीं कैसे पाश यह एक करने के लिए। रैंक "आर" कॉलम में रखा जाएगा जैसा कि आप एक्सेल आउटपुट में देख सकते हैं।

वैसे, यहाँ एसक्यूएल बयान मैं परिणाम आप स्क्रीनशॉट में देख पाने के लिए इस्तेमाल किया है।

SELECT 
    a.id, 
    a.date, 
    a.branch_code_id, 
    SUM(b.amount), 
    c.category 
FROM 
    sales_add_h AS a 
    INNER JOIN sales_add_i AS b ON a.id = b.sales_h_id 
    INNER JOIN control_panel_item_create AS c ON b.item_code_id = c.id 
GROUP BY c.category, a.branch_code_id, b.amount 
ORDER BY SUM(b.amount) DESC 

धन्यवाद दोस्तों!

+0

आप अपने परिदृश्य –

+0

का नमूना डेटाबेस प्रदान कर सकते हैं मैं एक्सेल फ़ाइल अपलोड की गई। (अपेक्षित आउटपुट।) – Yassi

+0

यदि आप इसे 'एसयूएम' करते हैं, तो आप 'b.amount' द्वारा समूह क्यों करते हैं? – Olexa

उत्तर

4

SELECT 
    @rn:=if(@prv=branch_code_id, @rn+1, 1) as rId, 
    @prv:= branch_code_id as branch_code_id, 
    val, 
    id, 
    date, 
    category 
FROM 
    (SELECT 
    a.id, 
    a.date, 
    a.branch_code_id, 
    SUM(b.amount) as val, 
    c.category 
    FROM 
    sales_add_h AS a 
    INNER JOIN 
    sales_add_i AS b ON a.id = b.sales_h_id 
    INNER JOIN 
    control_panel_item_create AS c ON b.item_code_id = c.id 
    GROUP BY 
    c.category, a.branch_code_id, b.amount 
    ORDER BY 
    a.branch_code_id, SUM(b.amount) DESC)tmp 
    JOIN 
    (SELECT @rn:=0, @prv:=0)t 

SQLFIDDLE कैसे रैंकिंग काम करता है समझने के लिए इस क्वेरी आज़माएं।

मैं हर branch_id के लिए रैंकिंग के रूप में आप का उल्लेख किया है, यदि आप एक विशेष शाखा में प्रत्येक श्रेणी के लिए रैंक करने के लिए की तुलना में आप एक और चर जो श्रेणी संग्रहीत करता है जोड़ सकते हैं और if clause भीतर यह तुलना करने की आवश्यकता चाहते हैं और यह भी सुलझाने के लिए की जरूरत किया है भीतरी क्वेरी के भीतर डेटा तदनुसार order by c.category, a.branch_code_id, SUM(b.amount) DESC

+0

अरे यह पूरी तरह से काम करता है :) बहुत बहुत धन्यवाद! मेरी आखिरी चिंता यह है कि जब मैं WHERE a.branch_code_id = 11 और c.category = "WLO" जोड़ता हूं तो यह रैंक = 1 सेट करता है जहां रैंक होना चाहिए 2. – Yassi

+0

जब आप कहां जोड़ते हैं, तो यह सभी रिकॉर्ड्स को फ़िल्टर करेगा दी गई शर्त और रैंक केवल फ़िल्टर किए गए रिकॉर्ड। रिकॉर्ड की जांच करें, जिसे आप उम्मीद कर रहे हैं रैंक 1 के रूप में जहां खंड में दिया गया है .. – Meherzad

+0

धन्यवाद सर! मैंने जो किया वह लूप बना देता है और एक विशिष्ट शाखा से सभी रैंक 1 को नीचे ले जाता है। आपके कोड ने मुझे बहुत मदद की और मेरा दिन बनाया :) बहुत बहुत धन्यवाद – Yassi

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