2012-03-22 14 views
8

मेरे पास निम्न तालिकाओंMySQL मैं इस सबक्वायरी को कैसे बना सकता हूं?

टेबल फार्म

+---------+--------+-------------------+-----------+------------+ 
| FARM_ID |Stock_ID| FARM_TITLE  | Size  | FARM_VALUE | 
+---------+--------+-------------------+-----------+------------+ 
|  2 |  1 | AgriZone   | M   |  202 | 
|  3 |  1 | Cow Mill   | L   |   11 | 
|  4 |  2 | Beef Farm   | H   |  540 | 
|  5 |  2 | CattleOne   | M   |  1080 | 
|  6 |  2 | FarmOne   | L   |  455 | 
|  7 |  3 | Perdue   | H   |  333 | 
|  8 |  4 | Holstein   | M   |  825 | 
|  10 |  1 | Dotterers   | H   |   98 | 
+---------+--------+-------------------+-----------+------------+ 

टेबल गेट

+---------+---------+------------+ 
| GATE_ID | FARM_ID | FARM_VALUE | 
+---------+---------+------------+ 
|  1 |  2 |   0 | 
|  1 |  3 |   0 | 
|  1 |  4 |  540 | 
|  2 |  4 |  550 | 
|  3 |  4 |  560 | 
|  4 |  4 |  570 | 
|  5 |  4 |  580 | 
|  6 |  4 |  590 | 
|  1 |  5 |  1080 | 
|  2 |  5 |  1100 | 
|  3 |  5 |  1120 | 
|  4 |  5 |  1140 | 
|  5 |  5 |  1160 | 
|  6 |  5 |  1180 | 
|  1 |  6 |  455 | 
|  2 |  6 |  536 | 
|  3 |  6 |  617 | 
|  4 |  6 |  698 | 
|  5 |  6 |  779 | 
|  6 |  6 |  860 | 
|  1 |  7 |   0 | 
|  1 |  8 |   0 | 
|  1 |  10 |   0 | 
+---------+---------+------------+ 

टेबल उत्पत्ति

+--------+----------+ 
| ORI_ID | ORI_NAME | 
+--------+----------+ 
|  1 | US  | 
|  2 | CA  | 
|  3 | MX  | 
+--------+----------+ 

टेबल स्टॉक

01,235,
+--------+--------+-------------------+ 
|Stock_ID| ORI_ID | Stock_TITLE  | 
+--------+--------+-------------------+ 
|  1 |  1 | P1    | 
|  2 |  2 | P3    | 
|  3 |  3 | Q4    | 
|  4 |  3 | B3    | 
+--------+--------+-------------------+ 

तालिका परिणाम

+-----------+---------+---------+------------+------------+ 
| RESULT_ID | FARM_ID | GATE_ID | FARM_VALUE | Score% | 
+-----------+---------+---------+------------+------------+ 
|   1 |  7 |  1 |  333 |  100 | 
|   2 |  8 |  1 |  825 |  100 | 
|   3 |  6 |  1 |  455 |   40 | 
|   4 |  6 |  2 |  536 |   0 | 
|   5 |  6 |  3 |  617 |   0 | 
|   6 |  6 |  4 |  698 |  100 | 
|   7 |  6 |  5 |  779 |   0 | 
|   8 |  6 |  6 |  860 |   10 | 
|   9 |  4 |  1 |  540 |  100 | 
|  10 |  4 |  2 |  550 |   90 | 
|  11 |  4 |  3 |  560 |   0 | 
|  12 |  4 |  4 |  570 |  100 | 
|  13 |  4 |  5 |  580 |   10 | 
|  14 |  4 |  6 |  590 |   0 | 
|  15 |  5 |  1 |  1080 |   0 | 
|  16 |  5 |  2 |  1100 |   0 | 
|  17 |  5 |  3 |  1120 |   0 | 
|  18 |  5 |  4 |  1140 |   50 | 
|  19 |  5 |  5 |  1160 |   0 | 
|  20 |  5 |  6 |  1180 |  100 | 
|  21 |  3 |  1 |   11 |  100 | 
|  22 |  10 |  1 |   98 |   90 | 
|  23 |  2 |  1 |  202 |  100 | 
+-----------+---------+---------+------------+------------+ 

एनोटेट परिणाम तालिका: वही जैसा कि ऊपर^

+-----------+---------+---------+------------+------------+ 
| RESULT_ID | FARM_ID | GATE_ID | FARM_VALUE | Score% | 
+-----------+---------+---------+------------+------------+ 

+-----------+---------+---------+------------+------------+ 
|   1 |  7 |  1 |  333 |  100 | <--|H-Case {H} 
+-----------+---------+---------+------------+------------+  

+-----------+---------+---------+------------+------------+  
|   2 |  8 |  1 |  825 |  100 | <--|M-Case {M} 
+-----------+---------+---------+------------+------------+ 

+-----------+---------+---------+------------+------------+ 
|   3 |  6 |  1 |  455 |   40 | 
|   4 |  6 |  2 |  536 |   0 | 
|   5 |  6 |  3 |  617 |   0 | 
|   6 |  6 |  4 |  698 |  100 | <--|L 
|   7 |  6 |  5 |  779 |   0 |  | 
|   8 |  6 |  6 |  860 |   10 |  | 
+-----------+---------+---------+------------+------------+  | 
|   9 |  4 |  1 |  540 |  100 |  | 
|  10 |  4 |  2 |  550 |   90 |  | 
|  11 |  4 |  3 |  560 |   0 |  | 
|  12 |  4 |  4 |  570 |  100 | <--+M-case {H,M,L} 
|  13 |  4 |  5 |  580 |   10 |  | 
|  14 |  4 |  6 |  590 |   0 |  | 
+-----------+---------+---------+------------+------------+  | 
|  15 |  5 |  1 |  1080 |   0 |  | 
|  16 |  5 |  2 |  1100 |   0 |  | 
|  17 |  5 |  3 |  1120 |   0 |  | 
|  18 |  5 |  4 |  1140 |   50 | <--|H 
|  19 |  5 |  5 |  1160 |   0 | 
|  20 |  5 |  6 |  1180 |  100 | 
+-----------+---------+---------+------------+------------+ 

+-----------+---------+---------+------------+------------+ 
|  21 |  3 |  1 |   11 |  100 | <--|L 
|  22 |  10 |  1 |   98 |   90 | <--+H-case {H,M,L} 
|  23 |  2 |  1 |  202 |  100 | <--|M 
+-----------+---------+---------+------------+------------+ 

संगणना आवश्यक:

  • टाइप कर सकते हैं अधिकतर केवल तीन मान हैं: {एच, एम, एल};
  • जब सभी मूल्यों मौजूद हैं, वे के रूप में पालन वर्गीकृत किया जाता है: एच = 70 एम = 20 एल = 10
  • सभी अद्वितीय casese

  • प्रकरण {एच, M} हैं: एच = 80 एम = 20

  • प्रकरण {M, एल}: M = 60 एल = 40
  • प्रकरण {एच, एल}: एच = 90 एल = 10
  • प्रकरण {एच}: एच = 100
  • प्रकरण {M }: एम = 100
  • केस {एल}: एल = 100
  • प्रकरण {एच, एम, एल}: एच = 70 एम = 20 एल के साथ कम से कम एक साथ = 10

अधिक विवरण

  • केवल स्टॉक GATE, पूरी तरह से संतुष्ट 100 अंक अधिकतम
    1. उदाहरण: Q4 में 6के 3 सेट हैं; केवल एक GATE सेट को संसाधित किया जाना चाहिए (एक स्कोर मौजूद है)।
    2. वर्तमान बिंदु से संबंधित विशेष मामले के मुकाबले गुणा किया जाना चाहिए उदाहरण: Q4 में मामला {एच, एम, एल} है जिसका अर्थ है एच = 70; एम = 20; एल यह (70 * 100%) + (20 * 50%) + (10 * 100%) में परिणाम = होगा = 10 90 (परिणाम तालिका टिप्पणियों को वापस ऊपर देखो)
    3. 2.
  • गेट पूरी तरह से संतुष्ट नहीं होने पर भी अंक को अभी भी माना जाना चाहिए और इसके लिए जिम्मेदार होना चाहिए।अर्जित MAX अंक वाले गेट को तब रखा जाना चाहिए जब कोई द्वार पूरी तरह से संतुष्ट न हो। (अधिक विवरण प्रदान करेगा समझा नहीं जा सका)

अगर हम तालिकाओं और डेटा की समझ बनाने के लिए एक प्रश्न प्रदर्शन करना ऐसा नीचे

+---------+-----------+---------------+-----------+---------+-----------+---------+ 
| Origin | Stock  | Farm Title | Farm Value| Gate | Size  | Score | 
+---------+-----------+---------------+-----------+---------+-----------+---------+ 
| US  | P1  | Perdue  |  333 |  1 | H   |  100 | 
| US  | P3  | Holstein  |  825 |  1 | M   |  100 | 
| CA  | Q4  | FarmOne  |  455 |  1 | L   |  40 | 
| CA  | Q4  | FarmOne  |  536 |  2 | L   |  0 | 
| CA  | Q4  | FarmOne  |  617 |  3 | L   |  0 | 
| CA  | Q4  | FarmOne  |  698 |  4 | L   |  100 | 
| CA  | Q4  | FarmOne  |  779 |  5 | L   |  0 | 
| CA  | Q4  | FarmOne  |  860 |  6 | L   |  10 | 
| CA  | Q4  | Beef Farm  |  540 |  1 | H   |  0 | 
| CA  | Q4  | Beef Farm  |  550 |  2 | H   |  90 | 
| CA  | Q4  | Beef Farm  |  560 |  3 | H   |  0 | 
| CA  | Q4  | Beef Farm  |  570 |  4 | H   |  100 | 
| CA  | Q4  | Beef Farm  |  580 |  5 | H   |  10 | 
| CA  | Q4  | Beef Farm  |  590 |  6 | H   |  0 | 
| CA  | Q4  | CattleOne  |  1080 |  1 | M   |  0 | 
| CA  | Q4  | CattleOne  |  1100 |  2 | M   |  0 | 
| CA  | Q4  | CattleOne  |  1120 |  3 | M   |  0 | 
| CA  | Q4  | CattleOne  |  1140 |  4 | M   |  50 | 
| CA  | Q4  | CattleOne  |  1160 |  5 | M   |  100 | 
| CA  | Q4  | CattleOne  |  1180 |  6 | M   |  0 | 
| MX  | B3  | Cow Mill  |  11 |  1 | L   |  100 | 
| MX  | B3  | Dotterers  |  98 |  1 | H   |  90 | 
| MX  | B3  | AgriZone  |  202 |  1 | M   |  100 | 
+---------+-----------+---------------+-----------+---------+-----------+---------+ 

इच्छा परिणाम

+---------+-------------------+-------+ 
| Origin | Stock   | score | 
+---------+-------------------+-------+ 
| US  | P1    | 100 | 
| US  | P3    | 100 | 
| CA  | Q4    | 90 | 
| MX  | B3    | 93 | 
+---------+-------------------+-------+ 
दिखेगा

Explanation

चूंकि origin में stock है जिसमें 3 अलग farms और farms में 6 gates प्रत्येक हैं। जब तक एक gate -set (संख्यात्मक रूप से मिलान gates) कुछ मूल्य पर स्कोर किया जाता है, हम पूरी तरह से STOCK को पूरी तरह से देख सकते हैं। यही एक रास्ता है एक stock इसके अलावा 100

माना जा सकता है और दोहराया है, STOCK Q4 मामला: {एच, एम, एल} और gate (4) के सभी कुछ हद तक मिला था। gate 4 में स्कोर (100% * एच) + (50% * एम) + (100% * एल) है जो बराबर (70 * 100%) + (20 * 50%) + (0 * 100%) = 90

इसलिए: (ऊपर से लिया)

| CA  | Q4    | 90 | 

QED

तो क्या मैं सबक्वेरी/सबसिलेक्ट पैदा कर रही है इस गणना के काम करने करने के लिए के साथ मदद की जरूरत है। मैंने उपरोक्त परिदृश्य में सबकुछ स्थापित किया है (नीचे एक क्वेरी के साथ जिसमें मैं काम कर रहा हूं) नीचे दिए गए एसक्यूएल फीड लिंक में।

धन्यवाद बहुत स्टैकओवरफ्लो समुदाय।

> The above problem in SqlFiddle can be found here <

+0

आपको किस समस्या का सामना करना पड़ रहा है? आपने सबक्वायरी क्यों इंगित की? – Randy

+6

होमवर्क की तरह दिखता है। – Crontab

+0

@Randy यह परिणाम तालिका के किसी प्रकार का सबक्वायरी होगा क्योंकि सभी जानकारी वहां से खींची जानी चाहिए। वांछित परिणाम – stackoverflow

उत्तर

1

मैं दूसरी अंतिम तालिका प्राप्त करने के लिए आपकी मूल क्वेरी लेने के लिए और उपयोग distinct (here पाया जाता है) को जोड़कर Select बदल सकते हैं और केवल उत्पत्ति, स्टॉक और स्कोर के लिए गणना का चयन करेंगे। उदाहरण के लिए यदि स्कोर उन सभी का औसत है तो यह AVG(Score) होगा जहां Score मूल क्वेरी में आपके द्वारा प्राप्त किया जाएगा। यदि आप उन वस्तुओं के केवल एक छोटे से सबसेट का उपयोग करना चाहते हैं जिनके पास समान उत्पत्ति और स्टॉक स्कोर की गणना करने के लिए है, तो मैं एक सबक्वायरी का उपयोग करूंगा, जहां उत्पत्ति और स्टिक आईडी से मेल खाता है, तो चयन करें ताकि आपके पास:

Select Origin, 
     Stock, 
     (select calculation(Score) from tables where tables.stock_id = .... tables.origin_id = .....) 
From.... 

उम्मीद है कि इससे मदद मिलती है।

+0

इससे मुझे बहुत मदद नहीं मिली। मुझे पता है कि मैं छद्म कोड का सारांश हूं। मैं सिर्फ वास्तविक एसक्यूएल – stackoverflow

+0

बनाने का तरीका नहीं समझ सकता हूं, अगर आप हमें अपनी दूसरी अंतिम तालिका प्राप्त करने के लिए एसक्यूएल दिखाते हैं तो हम आपको अंतिम तालिका (जिसे आप चाहते हैं) प्राप्त करने में मदद के लिए इसे और अधिक संकीर्ण कर सकते हैं। – Kyra

+0

यहाँ या जाओ। मैं पूरी स्थिति यहां से बना हूं जो मैंने इसे यहां तक ​​बना दिया है: http://sqlfiddle.com/#!2/4be72/3 – stackoverflow

4

यहां प्रश्न है कि मैं काम कर रहा हूं। हालांकि, परिणामों जिन्हें आप अपने प्रश्न में पोस्ट किया है से slighly अलग हैं:

select o.origin_name, s.stock_title, sum(
    case f.size 
    when 'H' then 
     case 
     when sizes = 'H,L,M' then 70 
     when sizes = 'H,M' then 80 
     when sizes = 'H,L' then 90 
     when sizes = 'H' then 100 
     else 0 
     end 
    when 'M' then 
     case 
     when sizes = 'H,L,M' then 20 
     when sizes = 'H,M' then 20 
     when sizes = 'L,M' then 60 
     when sizes = 'M' then 100 
     else 0 
     end 
    else 
     case 
     when sizes = 'H,L,M' then 10 
     when sizes = 'L,M' then 40 
     when sizes = 'H,L' then 10 
     when sizes = 'L' then 100 
     else 0 
     end 
    end * r.score/100) FinalScore 
from farm f 
join (
    select f.stock_id, group_concat(distinct f.size order by f.size) sizes 
    from farm f 
    join results r on f.farm_id = r.farm_id 
    group by f.stock_id 
) stockSizes on f.stock_id = stockSizes.stock_id 
join results r on f.farm_id = r.farm_id 
join (
    select f.stock_id, r.gate_id 
    from results r 
    join farm f on r.farm_id = f.farm_id 
    group by f.stock_id, r.gate_id 
    having sum(r.score = 0) = 0 
) FullGates 
on FullGates.stock_id = f.stock_id and FullGates.gate_id = r.gate_id 
join stock s on s.stock_id = f.stock_id 
join origin o on o.origin_id = s.origin_id 
group by o.origin_id, s.stock_id 

परिणाम:

 
+-------------+-------------+------------+ 
| ORIGIN_NAME | STOCK_TITLE | FINALSCORE | 
+-------------+-------------+------------+ 
| US   | P1   |   93 | 
| CA   | P3   |   90 | 
| MX   | Q4   |  100 | 
| MX   | B3   |  100 | 
+-------------+-------------+------------+ 

अगर यह चाल किया था मुझे जानते हैं।

+0

'यूएस पी 1 'में 100 होना चाहिए क्योंकि केवल मामला' {एच}' है और इसलिए 100 100 * 100 = 100 है। 'यूएस पी 2' में 100 होना चाहिए क्योंकि केवल मामला '{एम}' है का अर्थ है 'एम' = 100 और उस मामले में' एम 'का स्कोर 100 है। इसलिए 100% * 100 = 100, 'एमएक्स बी 3' में मामला {एचएमएल} है इसलिए 'एच' = 70,' एम' = 20 =, 'एल' = 20। एच में स्कोर 9 0 है (9 0% * 70) + (100% * 20) + (100% * 10) = 9 3। 'एमएक्स क्यू 4' में मामला है: {एच, एम, एल} और सभी गेट (4) मिला था। तो 'गेट 4' को देखते हुए जिसमें स्कोर (100% * एच) + (50% * एम) + (100% * एल) होता है जो बराबर (70 * 100%) + (20 * 50%) + (10 * 100%) = 90 – stackoverflow

+1

आपके द्वारा प्रदान की गई पहेली को देखते हुए 'पी 1'' यूएस 'के लिए एकमात्र स्टॉक मौजूद है, इसलिए आपका डेटा किसी भी समय गलत हो सकता है (या कम से कम आपके प्रश्न में डेटा से मेल नहीं खाता)। [Fiddle] देखें (http://sqlfiddle.com/#!2/4be72/3) आपने –

+1

को अच्छी तरह से किया है। बहुत अधिक धन्यवाद Mosty Mostacho! – stackoverflow

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