1

私はこの配列をSQLクエリからプッシュしています。

Array ( 
[0] => Array ( 
[TICK] => 1015 
    [KD_AIRL] => GA 
    [JUM] => 2834763198 )
[1] => Array ( 
[TICK] => 266 
    [KD_AIRL] => JT 
    [JUM] => 382940267 ) 
[2] => Array ( 
[TICK] => 153 
    [KD_AIRL] => SJY 
    [JUM] => 321328100 ) 
[3] => Array ( 
[TICK] => 672 
    [KD_AIRL] => GA 
    [JUM] => 1131468200.51 ) 
[4] => Array ( 
[TICK] => 239 
    [KD_AIRL] => JT 
    [JUM] => 229913500.25 ) 
[5] => Array ( 
[TICK] => 95 
    [KD_AIRL] => SJY 
    [JUM] => 102319151.00 ) 
)

上記の配列から、[KD_AIRL] でグループ化し、次のようにします。

Array ( 
[0] => Array ( 
[TICK] => 1687 
    [KD_AIRL] => GA 
    [JUM] => 3966231398 )
[1] => Array ( 
[TICK] => 505 
    [KD_AIRL] => JT 
    [JUM] => 612853767 ) 
[2] => Array ( 
[TICK] => 248 
    [KD_AIRL] => SJY 
    [JUM] => 423647251 ) 
)

[KD_AIRL] でグループ化した後、その配列 DESC を [JUM] で制限します。したがって、配列は次のようになります:(例、制限2行が必要です)

Array ( 
[0] => Array ( 
[TICK] => 1687 
    [KD_AIRL] => GA 
    [JUM] => 3966231398 )
[1] => Array ( 
[TICK] => 505 
    [KD_AIRL] => JT 
    [JUM] => 612853767 ) 
)

このケースで誰か助けてください..phpコードで何をすべきですか? よろしくお願いします。

更新 これは、SQL Server 2000 のすべてのブランチ データベースから選択する私の php コードです。

<?php
...
...
include "../../../config/dbreportis.php";
// Query for select name branch (NM_BRANCH) and its name database (NM_DATA) in server
$cbranch = mssql_query("SELECT NM_DATA, NM_BRANCH FROM Branch ORDER BY KD_BRANCH ASC");
while ($allbranch = mssql_fetch_array($cbranch)){
// Connect to each branches database (NM_DATA) 
include "../../../config/db.php";
mssql_select_db($allbranch[NM_DATA]);

// Query for selecting all customer and all airline
if (($customer == 'all_customer') AND ($airl == 'all_airline')){
$kueri = "
SELECT     TOP $batas COUNT(d.TICKNO) AS TICK, d.KD_AIRL, SUM(d.FARE + d.TAXIW +   
d.VATVAL + d.TRANSFEE - d.DISVAL) AS JUM
FROM         DInvoiceT d INNER JOIN
HINVOICE h ON h.INVNO = d.INVNO AND h.SRK = d.SRK LEFT OUTER JOIN
Airline a ON a.KD_AIRL = d.KD_AIRL 
WHERE     (h.INVDATE >= '$from') AND (h.INVDATE <= '$to') AND (h.INOUT = '$inout')  
AND (h.SRK = 'TX') AND (h.CPRINT = 'Y') AND (h.SVD = '')
GROUP BY d.KD_AIRL
ORDER BY JUM DESC";
}
// Query for selecting all customer but specific airline
elseif (($customer == 'all_customer') AND ($airl != 'all_airline')){
$kueri = "
SELECT     TOP $batas COUNT(d.TICKNO) AS TICK, d.KD_AIRL, SUM(d.FARE + d.TAXIW +   
d.VATVAL + d.TRANSFEE - d.DISVAL) AS JUM
FROM         DInvoiceT d INNER JOIN
HINVOICE h ON h.INVNO = d.INVNO AND h.SRK = d.SRK LEFT OUTER JOIN
Airline a ON a.KD_AIRL = d.KD_AIRL 
WHERE     (h.INVDATE >= '$from') AND (h.INVDATE <= '$to') AND (h.INOUT = '$inout') AND 
(h.SRK = 'TX')  AND (d.KD_AIRL = '$airl') AND (h.CPRINT = 'Y') AND (h.SVD = '')
GROUP BY d.KD_AIRL
ORDER BY JUM DESC";
}
$ticket= 0;
$sumvalue = 0;
$data = mssql_query($kueri);

while ($r = mssql_fetch_assoc($data)){
$nm_airl = mssql_query("SELECT NM_AIRL FROM Airline WHERE KD_AIRL = '$r[KD_AIRL]'");
$do_airl = mssql_fetch_array($nm_airl);
if ($do_airl['NM_AIRL'] == ''){
$nama_airline = '';
}elseif ($do_airl['NM_AIRL'] != ''){
$nama_airline = $do_airl['NM_AIRL'];
}
$do_nama_airline = "$r[KD_AIRL]-$nama_airline";
echo "<tr>
<td align='left'>$no</td>
<td align='left'>$do_nama_airline</td>
<td align='right'>$r[TICK]</td>
<td align='right'>".number_format($r[JUM], 2 , '.' , ',' );
echo "</td>
</tr>";
$ticket += $r['TICK'];
$sumvalue += $r['JUM'];
$ticket_all += $r['TICK'];
$sumvalue_all += $r['JUM'];
$no++;
} 
if ($sumvalue > 0){
echo "<tr>
<td colspan='2' align='right'>Total $airline1 :</td>
<td align='right'>".number_format($ticket, 2 , '.' , ',' );
echo "</td>
<td align='right'>".number_format($sumvalue, 2 , '.' , ',' );
echo "</td>
</tr>";
}
}
echo "<tr>
<td colspan='2' align='right'>Grand Total</td>
<td align='right'>".number_format($ticket_all, 2 , '.' , ',' );
echo "</td>
<td align='right'>".number_format($sumvalue_all, 2 , '.' , ',' );
echo "</td>
</tr>";
echo "</table>";
mssql_close();
?>

上記のコードでは、20 個のブランチがあり、上位 20 個の結果を表示したい場合、スクリプトは 20*20 = 400 行の結果を返します。しかし、私が欲しいのは、20行を表示し、[KD_AIRL]でグループ化し、[JUM]でDESCをソートしたレポートです。

したがって、上記のスクリプトからのクエリ結果を新しい配列にプッシュしてから、[KD_AIRL] でグループ化し、[JUM] で DESC を並べ替え、最終的に 20 に制限しようとします (たとえば)。

注意 : 以下のソリューション スクリプトを使用すると、すべての [KD_AIRL] グループ化 (eq [GA] が再び繰り返される) ではありません: この結果は、SQL サーバーのすべてのブランチ データベースから取得されます。

Array
(
    [GA ] => Array
    (
        [TICK] => 1863
        [KD_AIRL] => GA 
        [JUM] => 3906190760.99
    )

    [JT ] => Array
    (
        [TICK] => 787
        [KD_AIRL] => JT 
        [JUM] => 723166135.39
    )

    [SJY] => Array
    (
        [TICK] => 138
        [KD_AIRL] => SJY
        [JUM] => 164732319
    )

    [GAC] => Array
    (
        [TICK] => 101
        [KD_AIRL] => GAC
        [JUM] => 145669200
    )

    [GA] => Array
    (
        [TICK] => 52
        [KD_AIRL] => GA
        [JUM] => 60380240
    )

    [KP ] => Array
    (
        [TICK] => 29
        [KD_AIRL] => KP 
        [JUM] => 31069700
    )

    [JT] => Array
    (
        [TICK] => 41
        [KD_AIRL] => JT
        [JUM] => 31058000
    )

    [QG ] => Array
    (
        [TICK] => 46
        [KD_AIRL] => QG 
        [JUM] => 30951350.57
    )

    [ID ] => Array
    (
        [TICK] => 36
        [KD_AIRL] => ID 
        [JUM] => 22508000
    )

    [MZ ] => Array
    (
        [TICK] => 26
        [KD_AIRL] => MZ 
        [JUM] => 22081400
    )

    [AK ] => Array
    (
        [TICK] => 23
        [KD_AIRL] => AK 
        [JUM] => 21385468
    )

    [TGN] => Array
    (
        [TICK] => 26
        [KD_AIRL] => TGN
        [JUM] => 20125400
    )

    [QZ ] => Array
    (
        [TICK] => 17
        [KD_AIRL] => QZ 
        [JUM] => 12856500
    )

    [QZ] => Array
    (
        [TICK] => 11
        [KD_AIRL] => QZ
        [JUM] => 8810000
    )

    [IW ] => Array
    (
        [TICK] => 4
        [KD_AIRL] => IW 
        [JUM] => 6965000
    )

    [RI ] => Array
    (
        [TICK] => 6
        [KD_AIRL] => RI 
        [JUM] => 6494800
    )

    [IL ] => Array
    (
        [TICK] => 7
        [KD_AIRL] => IL 
        [JUM] => 5572000
    )

    [SI ] => Array
    (
        [TICK] => 6
        [KD_AIRL] => SI 
        [JUM] => 5260800
    )

    [6N ] => Array
    (
        [TICK] => 6
        [KD_AIRL] => 6N 
        [JUM] => 4187520
    )

    [MV ] => Array
    (
        [TICK] => 2
        [KD_AIRL] => MV 
        [JUM] => 3225735
    )

)

私が必要としているのは、すべての [KD_AIRL] グループ化およびソートされた DESC であり、最終的には 20 行に制限されています (たとえば)。PHPコードではなく、SQLクエリだけで必要なレポートを取得する方法があればいいのですが。この場合の解決策を教えてください。どうもありがとう。

4

3 に答える 3

1

このコードを試す

<?php
// Your mysql result
$myArray = Array ( 0 => Array ('TICK' => 1015, 'KD_AIRL' => 'GA','JUM' => 2834763198 ),
                 1 => Array ('TICK' => 266 ,'KD_AIRL' => 'JT','JUM' => 382940267 ) ,
                 2 => Array ('TICK' => 153 ,'KD_AIRL' => 'SJY','JUM' => 321328100 ),
                 3 => Array ('TICK' => 672,'KD_AIRL' => 'GA','JUM' => 1131468200.00 ),
                 4 => Array ('TICK' => 239,'KD_AIRL' => 'JT','JUM' => 229913500.00 ) ,
                 5 => Array ('TICK' => 95,'KD_AIRL' => 'SJY','JUM' => 102319151.00 ) );

// Some Variables are declare here               
$sumArray = array();
$getAllData = array();
$final_result = array();

// *********** Some Function **************************
// Sum, your array
function sum_array($myArray){
    $return = array();
    foreach ($myArray as $k=>$subsumArray) {
      foreach ($subsumArray as $id=>$value) {

        if($id == 'KD_AIRL'){
            $return[$id] =$value;
        }else{
            $return[$id]+=$value;
        }
      }
    }
return $return;      

}
//////////////////////
function cmp($a, $b) {

    $a = $a['JUM'];
    $b = $b['JUM'];

    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? 1 : -1;
}
//***********************************************************

foreach ($myArray as $k=>$subArray) {
    $getAllData[$subArray['KD_AIRL']][] = $subArray;            
}

// Replace below code with old new(changes baove code)
$new_array = array();
foreach ($getAllData as $key => $Data_val){

    if (!array_key_exists($key, $final_result)) {
       $final_result[$key] = sum_array($Data_val);
       $new_array[] =  sum_array($Data_val);
    }   
}


uasort($new_array, 'cmp');


// Set limit
$limit = 2;
$oupout=array_slice($new_array,0,$limit);

echo "<pre>";
print_r($oupout);
echo "</pre>";
exit;

?>
于 2013-10-04T07:01:33.647 に答える
0

Mysql Function GroupBy、Sum、および Limit によってそれを簡単にsloveする方法、

テーブル構造とSQLクエリを教えてください。

<?php
// Your mysql result
$myArray = Array ( 0 => Array ('TICK' => 1015, 'KD_AIRL' => 'GA','JUM' => 2834763198 ),
                 1 => Array ('TICK' => 266 ,'KD_AIRL' => 'JT','JUM' => 382940267 ) ,
                 2 => Array ('TICK' => 153 ,'KD_AIRL' => 'SJY','JUM' => 321328100 ),
                 3 => Array ('TICK' => 672,'KD_AIRL' => 'GA','JUM' => 1131468200.00 ),
                 4 => Array ('TICK' => 239,'KD_AIRL' => 'JT','JUM' => 229913500.00 ) ,
                 5 => Array ('TICK' => 95,'KD_AIRL' => 'SJY','JUM' => 102319151.00 ) );

// Some Variables are declare here               
$sumArray = array();
$getAllData = array();
$final_result = array();

// *********** Some Function **************************
// Sum, your array
function sum_array($myArray){
    $return = array();
    foreach ($myArray as $k=>$subsumArray) {
      foreach ($subsumArray as $id=>$value) {

        if($id == 'KD_AIRL'){
            $return[$id] =$value;
        }else{
            $return[$id]+=$value;
        }
      }
    }
return $return;      

}
//////////////////////
function cmp($a, $b) {

    $a = $a['JUM'];
    $b = $b['JUM'];

    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? 1 : -1;
}
//***********************************************************

foreach ($myArray as $k=>$subArray) {
    $getAllData[$subArray['KD_AIRL']][] = $subArray;            
}


foreach ($getAllData as $key => $Data_val){

    if (!array_key_exists($key, $final_result)) {
       $final_result[$key] = sum_array($Data_val);  
    }   
}

uasort($final_result, 'cmp');

// Set limit
$limit = 2;
$oupout=array_slice($final_result,0,$limit);

echo "<pre>";
print_r($oupout);
echo "</pre>";
exit;

?>

あなたのアウトプット


<pre>Array
(
    [GA] => Array
        (
            [TICK] => 1687
            [KD_AIRL] => GA
            [JUM] => 3966231398
        )

    [JT] => Array
        (
            [TICK] => 505
            [KD_AIRL] => JT
            [JUM] => 612853767
        )

)
</pre>

于 2013-10-03T08:47:44.027 に答える