2012-03-22 14 views
8

tengo las siguientes tablasMySQL ¿Cómo creo esta subconsulta?

mesa de granja

+---------+--------+-------------------+-----------+------------+ 
| 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 | 
+---------+--------+-------------------+-----------+------------+ 

Tabla Puerta

+---------+---------+------------+ 
| 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 | 
+---------+---------+------------+ 

Tabla Origen

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

Tabla de

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

tabla de resultados

+-----------+---------+---------+------------+------------+ 
| 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 | 
+-----------+---------+---------+------------+------------+ 

Tabla de resultados anotado: Igual que el anterior^

+-----------+---------+---------+------------+------------+ 
| 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 
+-----------+---------+---------+------------+------------+ 

cálculos requeridos:

  • tipo puede tener solo tres valores como máximo: {H, M, L};
  • Cuando todos los valores están presentes, se califican como sigue: H = 70 M = 20 L = 10
  • casese ALL únicas son

  • Case {H, H}: H = 80 M = 20

  • Case {M, L}: M = 60 L = 40
  • Case {H, L}: H = 90 L = 10
  • Case {H}: H = 100
  • Case {M }: M = 100
  • Caso {L}: L = 100
  • Case {H, M, L}: H = 70 M = 20 L = 10

explicación adicional

  • Sólo Stock con con al menos unoGATE, totalmente satisfecho puede obtener 100 puntos máximo
    1. Ejemplo: Q4 tiene 3 juegos de 6 GATES; Solo un conjunto de GATE debe ser satsificado (tenga un puntaje presente).
    2. Los puntos presentes se deben Multiplicar en el caso particular que corresponda Ejemplo: Q4 tiene mayúsculas y minúsculas {H, M, L} que significa H = 70; M = 20; L = 10 Esto da como resultado (70 * 100%) + (20 * 50%) + (10 * 100%) = 90 (mirar hacia atrás por encima de las anotaciones tabla de resultados)
    3. 2.
  • Los puntos deben considerarse y contabilizarse incluso cuando una puerta no se ha satisfecho por completo.La puerta con los puntos MAX ganados debe mantenerse cuando no se han cumplido por completo las puertas. (Proporcionará una explicación más detallada si no se entiende)

si realizamos una consulta para dar sentido a las tablas y los datos que se verá como a continuación

+---------+-----------+---------------+-----------+---------+-----------+---------+ 
| 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 | 
+---------+-----------+---------------+-----------+---------+-----------+---------+ 

deseo Resultados

+---------+-------------------+-------+ 
| Origin | Stock   | score | 
+---------+-------------------+-------+ 
| US  | P1    | 100 | 
| US  | P3    | 100 | 
| CA  | Q4    | 90 | 
| MX  | B3    | 93 | 
+---------+-------------------+-------+ 

Explanation

Dado que origin tiene un stock que consta de 3 diferentes farms y esos farms tienen 6 gates cada uno. Siempre que uno gate -set (numéricamente coincidente gates) se califique con ALGÚN valor, podemos considerar la totalidad de STOCK encontrada por completo. Esta es la única manera que un stock puede considerarse 100.

Además y reiterar, STOCK Q4 tiene caso: {H, M, L} y todos gate (4) se encontró en algún grado. gate 4 tiene el puntaje (100% * H) + (50% * M) + (100% * L) que equivale a (70 * 100%) + (20 * 50%) + (10 * 100%) = 90

Por lo tanto: (Tomado desde arriba)

| CA  | Q4    | 90 | 

QED

Entonces, ¿qué necesito ayuda con es la creación de la sub consulta/subselección que hacer que esto funcione cálculo. Configuré todo en el escenario anterior (junto con una consulta en progreso con la que he estado trabajando) en el siguiente enlace SQL.

Gracias en gran medida a la comunidad de stackoverflow.

> The above problem in SqlFiddle can be found here <

+0

¿con qué estás teniendo problemas? ¿Por qué indicó subconsulta? – Randy

+6

Parece una tarea. – Crontab

+0

@Randy Será algún tipo de subconsulta de la tabla de resultados porque toda la información deberá extraerse de allí. Solo el nombre del origen y el título de la acción deberán usarse para la presentación en el resultado deseado – stackoverflow

Respuesta

1

tomaría su búsqueda original para obtener la segunda tabla anterior y cambiar el Select añadiendo uso distinct (que se encuentra here) y sólo seleccione Origen, Stock y el cálculo de la puntuación. Por ejemplo, si el puntaje es un promedio de todos ellos, sería AVG(Score) donde Score sería lo que buscó en la consulta original. Si desea usar solo un pequeño subconjunto de los ítems que tienen el mismo Origen y Stock para calcular el Puntaje, yo usaría una subconsulta, con el que coincida con los Id. De Origen y Palo, en el seleccionar para que tenga:

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

Espero que esto ayude.

+0

Esto no me ayudó demasiado. Sé que es la esencia del pseudo código. Simplemente no puedo imaginar cómo crear el sql real – stackoverflow

+0

Quizás si nos muestra el sql para obtener su segunda última tabla, podemos restringirlo más para ayudarlo a obtener la última tabla (la que desea). – Kyra

+0

Aquí tienes. Creo la situación completa a partir de lo que he hecho hasta ahora aquí: http://sqlfiddle.com/#!2/4be72/3 – stackoverflow

4

Aquí está la consulta en la que he estado trabajando. Sin embargo, los resultados son ligeramente diferentes de los que has publicado en tu pregunta:

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 

Resultado:

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

Vamos a saber si esto hizo el truco.

+0

'US P1' debe tener 100 porque solo hay caso' {H} 'y la puntuación es 100, por lo tanto, 100% * 100 = 100.' US P2' debe tener 100 porque solo hay caso '{M}' que significa 'M' = 100 y que' M' tiene el puntaje de 100 en este caso. Por lo tanto, 100% * 100 = 100, 'MX B3' tiene el caso {HML} por lo tanto' H' = 70, 'M' = 20 =,' L' = 20. H tiene el puntaje 90 porque (90% * 70) + (100% * 20) + (100% * 10) = 93. 'MX Q4 'tiene el caso: {H, M, L} y todo en la puerta (4) fue encontrado. Así que mirando 'puerta 4' que tiene el puntaje (100% * H) + (50% * M) + (100% * L) que es igual a (70 * 100%) + (20 * 50%) + (10 * 100%) = 90 – stackoverflow

+1

Dado el violín que proporcionó 'P1' es el único stock presente para' US', por lo que sus datos deben ser inexactos de alguna manera (o al menos no coinciden con los datos en su pregunta). Vea el [violín] (http://sqlfiddle.com/#!2/4be72/3) que ha proporcionado –

+1

bien hecho. ¡Muchas gracias a Mosty Mostacho! – stackoverflow

Cuestiones relacionadas