Bir alana göre gruplandırılmış MAX verileri göstermek için Sorgu sonucu manipüle

2 Cevap php

İşte benim Varolan sorgu:

$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());

BURAYA ÇIKTI IS:

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

Ben ihtiyacım çıktı Parti Numarası başına sadece MAX hataları göstermektir.

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

Canyou sorgu ile bana yardımcı olabilir mi? Şimdiden teşekkürler

2 Cevap

Eğer test_name alanına ihtiyacınız yoksa, bu gerçekten çok kolay. Bu durum ise, sadece sizin tüm sorguyu sarın:

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

Bu size toplu sayısına göre maksimum arızaları verecektir, ama size maksimum başarısızlıkları karşılık test_name vermeyecektir. test_name almak için, size gösterdiği gibi, bir alt sorgu katılmak yapmak gerekir here. Ya da here.

sorgu zaten oldukça karmaşıktır çünkü senin durumunda, ben geçici bir tabloya dönüştürerek tavsiye ederim:

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

o zaman bu linklere önerilen adımlardan birini yaparak max alabilirsiniz. Örneğin:

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;

MySQL Eğer yuva sorguları yapabilirsiniz, böylece gibi geçici bir tablo olarak sizin ilk sorgunun sonucu tedavi edebilir:

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')

Bu bir ilk tahminim ama aslında tek seferde sorgu gerçekleştirmek için gereken çeşitli "görüşlerini" yazmak ve sonra tablolar gibi SELECT ifadeleri tedavi sonucudur.

Eğer MySQLs views veya kod nihai toplama yapıyor gibi alternatif yöntemler düşünebilirsiniz böylece bu da oldukça verimsiz olabilir.

Benim sorguda kullanılan tekniği hakkında daha fazla bilgi istiyorsanız, o zaman MySQL sitede this page check out.