2009-10-06 6 views
0

Voici ma requête existante:résultat Manipuler requête pour afficher les données MAX regroupées par un champ

$Pareto = mysql_query("SELECT 
      zsca_open.tqs_batch_num AS 'Batch Number', 
      ft_tests.test_name AS 'Test Name', 
      (SUM(ft_stats.over_filter + ft_stats.under_filter)) AS 'Failures' 
     FROM 
      ((zsca_open INNER JOIN ft_header ON zsca_open.tqs_batch_num = ft_header.batch_code) 
      INNER JOIN ft_tests ON ft_header.serial_hi = ft_tests.serial_hi) 
      INNER JOIN ft_stats ON ft_tests.serial_si = ft_stats.serial_si 
     WHERE 
      (((zsca_open.vendor)='ASE') 
      AND ((zsca_open.lot_type)='T') 
      AND ((zsca_open.status)='H') 
      AND ((zsca_open.is_active)=1) 
      AND ((zsca_open.rec_ver)=0) 
      AND ((ft_header.test_step)='PROD') 
      AND ((ft_header.status)='VIRGIN') 
      AND ((ft_stats.stats_name)='spec_stats')) 
     GROUP BY 
      zsca_open.tqs_batch_num, 
      ft_tests.test_name 
     HAVING 
      (((ft_tests.test_name) Not In ('SW Bin','HW Bin','Pass'))) 
     ORDER BY 
      SUM(ft_stats.over_filter + ft_stats.under_filter) DESC") or die(mysql_error()); 

EST ICI LA SORTIE:

Batch Number TestName Failures <br> 
0938AT5213 PCS_Pout 2865 <br> 
0939AT5228 LB_PAE 921 <br> 
0938AT5213 DCS_Pout 769 <br> 
0939AT5228 LB_Pout_Nom 730 <br> 
0939AT5228 LB_Pout 642 <br> 
0938AT5213 DCS_PAE 517 <br> 
0919AT3366 Iswitch 513 <br> 
0938AT5213 PCS_PAE 481 <br> 
0939AT5228 RX2_Insert_Loss 474 <br> 
0939AT5228 HB_PAE 470 <br> 
0939AT5228 HB_Pout 434 <br> 
0939AT5228 HB_Pout_Nom 426 <br> 
0919AT3366 ACLR1L_H1_846p6 399 

La sortie j'ai besoin est de montrer que les échecs MAX par numéro de lot.

Batch Number test_name Failures <br> 
0938AT5213 PCS_Pout 2865 <br> 
0939AT5228 LB_PAE 921<br> 
0919AT3366 Iswitch 513 

Pouvez-vous m'aider avec la requête? Merci d'avance

Répondre

0

C'est vraiment simple si vous n'avez pas besoin du champ test_name. si tel est le cas, il suffit envelopper toute votre requête dans:

SELECT `Batch Number`, max(Failures) from (**YOURQUERYHERE**) as myquery GROUP BY Failures; 

cela vous donnera les échecs max par numéro de lot, mais ne vous donnera pas la test_name qui correspond aux défaillances max. Pour obtenir le nom_test, vous devez effectuer une jointure de sous-requête, comme illustré here. Ou here.

dans votre cas, puisque votre requête est déjà assez compliqué, je recommande la transformer en une table temporaire:

CREATE TEMPORARY TABLE mytable (batch varchar(30), testname varchar(30), failures INT); 
INSERT INTO mytable (**YOURQUERYHERE**); 

alors vous pouvez obtenir le maximum en effectuant l'une des étapes recommandées sur les liens . par exemple:

SELECT t1.batch, t1.testname, t1.failures 
    FROM mytable AS t1, 
     (SELECT batch, MAX(failures) AS maxfail 
      FROM mytable 
     GROUP BY batch) AS t2 
    WHERE t2.batch = t1.batch 
     AND t1.failures = t2.maxfail; 
0

MySQL vous pouvez d'imbriquer des requêtes, de sorte que vous pouvez traiter le résultat de votre requête initiale comme une table temporaire comme:

SELECT 
     batches.'Batch Number', 
     tests.'Test Name', 
     batches.'Failures' 
FROM 
(
     SELECT 
       zsca_open.tqs_batch_num AS 'Batch Number', 
       MAX(SUM(ft_stats.over_filter + ft_stats.under_filter)) AS 'Failures' 
     FROM 
       ((zsca_open INNER JOIN ft_header ON zsca_open.tqs_batch_num = ft_header.batch_code) 
       INNER JOIN ft_tests ON ft_header.serial_hi = ft_tests.serial_hi) 
       INNER JOIN ft_stats ON ft_tests.serial_si = ft_stats.serial_si 
     WHERE 
       (((zsca_open.vendor)='ASE') 
       AND ((zsca_open.lot_type)='T') 
       AND ((zsca_open.status)='H') 
       AND ((zsca_open.is_active)=1) 
       AND ((zsca_open.rec_ver)=0) 
       AND ((ft_header.test_step)='PROD') 
       AND ((ft_header.status)='VIRGIN') 
       AND ((ft_stats.stats_name)='spec_stats')) 
     GROUP BY 
       zsca_open.tqs_batch_num 
     HAVING 
       (((ft_tests.test_name) Not In ('SW Bin','HW Bin','Pass'))) 
) batches 
INNER JOIN ft_header ON tests.'Batch Number' = ft_header.batch_code 
INNER JOIN (
     SELECT 
       ft_tests.serial_hi, 
       ft_tests.test_name AS 'Test Name', 
       SUM(ft_stats.over_filter + ft_stats.under_filter) AS 'Failures' 
     FROM 
       ft_tests 
     GROUP BY 
       ft_tests.serial_hi,ft_tests.test_name 
) tests ON (ft_header.serial_hi = tests.serial_hi AND test.'Failures' = bartches.'Failures') 

C'est une première estimation, mais il est essentiellement résultat de l'écriture des différentes "vues" dont vous avez besoin pour effectuer la requête en une seule fois, puis en traitant les instructions SELECT comme des tables.

Cela peut également être assez inefficace, donc vous pouvez envisager d'autres méthodes comme l'utilisation de MySQL views ou l'agrégation finale dans le code.

Si vous souhaitez plus d'informations sur la technique utilisée dans ma requête, consultez this page sur le site MySQL.

Questions connexes