สอบถามปัญหาโค้ด ขอคำแนะนำผู้รู้เรื่อง PHP GROUP BY และ SUM ครับผม
รบกวพี่ๆด้วยครับผม
พอผมไม่ใส่ GROUP BY ออกมาครบครับผม ตามรูป 1
พอผม GROUP BY สินค้าแล้ว แสดงข้อมูลไม่ถูกต้องตามรูป 2 ครับผม ขอบคุณครับผม
โค้ดที่ไส่ GROUP BYครับผม
<table class="table table-bordered table-condensed" style="width:100%;">
<thead>
<tr class="bg-success">
<th>วันที่</th>
<th>สินค้า</th>
<th>จำนวนชิ้น</th>
<th>ราคารวม</th>
</tr>
</thead>
<tbody>
<?php
// ส่วนของการกำนหดแสดงการแบ่ง ส่วนของข้อมูลของวันที่ที่ต่างกัน
$temp_data1=null;
$temp_data2=null;
$data_show=1; // 1 แสดง 0 ไม่แสดง
// กำหนดสำหรับอ้างอิง key ของตัวแปร
$i=1;
// ส่วนกำหนดตัวแปร สำหรับเก็บค่าวันที่ และเปรียบเทียบ
$arr_dateCheck=[];
// ส่วนกำหนดตัวแปรสำหรับเก็บค่าข้อมูลสะสมในแต่ละ คอลัมน์ที่ต้องการ กำหนดเป็น array
$aggre_price=[];
$aggre_com=[];
// ส่วนกำหนดตัวแปรสำหรับเก็บค่าข้อมูลในแต่ละ คอลัมน์ที่ต้องการ กำหนดเป็น array
$data_price=[];
$data_com=[];
$aaa=$_GET[aa];
//echo "$spro";
//echo $_GET[aa];
if ($aaa=="1"){
$q="
SELECT * FROM tb_orders GROUP BY orpackets ORDER BY ordates
";
} else if($spro=="0"){
$q="
SELECT * FROM tb_orders WHERE (ordates BETWEEN '$bdate' AND '$edate') OR orpackets='$spro' ORDER BY ordates
";
} else {
$q="
SELECT * FROM tb_orders WHERE (ordates BETWEEN '$bdate' AND '$edate') AND orpackets='$spro' ORDER BY ordates
";
}
$rs=$mysqli->query($q);
$total=$rs->num_rows;
while($data=$rs->fetch_assoc()){
$show_row_end=0; // เริ่มต้นการแบ่ง กำหนดเป็น 0
// จัดรูปแบบ key วันที่ที่จะใช้เก็บข้อมูล (หากไม่ได้ใช้วันที่ ประยุกต์เป็นอย่างอื่นตามต้องการ)
$dateKey=date("dmY",strtotime($data['ordates']));
/// ส่วนของการกำนหด การเปรียบค่าของรายการ เพื่อแบ่งวันที่เป็นสัดส่วน
$temp_data1=$data['ordates'];
if($temp_data2==null){
$temp_data2=$temp_data1;
$data_show=1;
}else{
if($temp_data1==$temp_data2){
$data_show=0;
$temp_data2=$temp_data1;
}else{
$temp_data2=$temp_data1;
$data_show=1;
}
}
// เก็บค่าวันที่ของรายการข้อมูลไว้ในตัวแปร สำหรับเปรียบเทียบ
$arr_dateCheck[$i]=$data['ordates'];
// ถ้าไม่ใช้ข้อมูลรายการแรก และ ข้อมูลวันที่รายการก่อนหน้า ไม่เท่ากับรายการที่กำลังแสดง
// นั่นหมายถึงจุดที่เราจะกำหนดว่า เป็นรายการสุดท้ายของวันที่หนึ่งๆ
if($i>1 && $arr_dateCheck[$i-1]!=$data['ordates']){
// กำหนด key วันที่ที่จะเช็ค
$dateKeyCheck=date("dmY",strtotime($arr_dateCheck[$i-1]));
$show_row_end=1; // ให้แสดง หรือแทรกแถวที่ต้องการได้
}
// ส่วนของการเก็บข้อมูลไว้ใน array เพื่อใช้งานผลรวม
if(!isset($data_price[$dateKey])){ // ถ้าไม่มีตัวแปร
$data_price[$dateKey]=[]; // ให้กำหนด
array_push($data_price[$dateKey],$data['allqualitys']); // และเพิ่มค่า
}else{
array_push($data_price[$dateKey],$data['allqualitys']); // เพิ่มค่าใน array
}
if(!isset($data_com[$dateKey])){
$data_com[$dateKey]=[];
array_push($data_com[$dateKey],$data['orprices']);
}else{
array_push($data_com[$dateKey],$data['orprices']);
}
?>
<?php
// แทรกแถวที่ต้องการกรณีปกติ กรณีนี้ รายการสุดท้ายจะไม่ขึ้น เราจะเพิ่มการแทรกไว้ด้านหลัง
// ของข้อมูลแทน
if($show_row_end==1){?>
<?php
// รวมค่าข้อมูลแต่ละวัน แล้วเพิ่มเข้าไปใน array รายการค่าสะสม
array_push($aggre_price,array_sum($data_price[$dateKeyCheck]));
array_push($aggre_com,array_sum($data_com[$dateKeyCheck]));
?>
<tr class="bg-warning">
<td class="text-right">รวม</td>
<td></td>
<td><?=array_sum($data_price[$dateKeyCheck])?></td>
<td><?=array_sum($data_com[$dateKeyCheck])?></td>
</tr>
<tr class="bg-info">
<td class="text-right">รวมทั้งหมด</td>
<td></td>
<td><?=array_sum($aggre_price)?></td>
<td><?=array_sum($aggre_com)?></td>
</tr>
<?php } ?>
<tr>
<td>
<?php if($data_show==1){?>
<?=$data['ordates']?>
<?php } ?>
</td>
<td><?=$Q01?>
<?php
// $data['orpackets']
$orpacketss = $data['orpackets'] ;
//echo "$orpacketss";
$strSQL = "SELECT * FROM tb_products WHERE ID = '$orpacketss' ";
$objQuery = mysql_query($strSQL);
while($objResult = mysql_fetch_array($objQuery))
{
echo $objResult["productnames"];
}
?>
</td>
<td><?=$data['allqualitys']?></td>
<td><?=$data['orprices']?></td>
</tr>
<?php if(
// สำหรับแทรก กรณีเป็นรายการสุดท้ายในตาราง
$i==$total){?>
<?php
// รายการสุดท้าย กำหนด key เช็คเป็นค่าที่รูปแบบตรงกัน
$dateKeyCheck=date("dmY",strtotime($data['ordates']));
// รวมค่าข้อมูลแต่ละวัน แล้วเพิ่มเข้าไปใน array รายการค่าสะสม
array_push($aggre_price,array_sum($data_price[$dateKeyCheck]));
array_push($aggre_com,array_sum($data_com[$dateKeyCheck]));
?>
<tr class="bg-warning">
<td class="text-right">รวม</td>
<td></td>
<td><?=array_sum($data_price[$dateKeyCheck])?></td>
<td><?=array_sum($data_com[$dateKeyCheck])?></td>
</tr>
<tr class="bg-info">
<td class="text-right">รวมทั้งหมด</td>
<td></td>
<td><?=array_sum($aggre_price)?></td>
<td><?=array_sum($aggre_com)?></td>
</tr>
<?php } ?>
<?php $i++; } ?>
</tbody>
</table>Tag : PHP, MySQL
Date :
2019-04-14 07:47:26
By :
sensaiya
View :
1182
Reply :
4
Code (SQL)
select *, sum(xxx) as sumxxx, sum(yyy) as sumyyy
from .....
where ....
group by zzzz
Date :
2019-04-14 08:24:37
By :
Chaidhanan
ผมลองแล้วครับผม ได้เหมือน รูปที่ 2 เหมือนเดิมเลยครับผม
$q="
SELECT *, sum(allqualitys) as sumQ FROM tb_orders GROUP BY orpackets ORDER BY ordates
";
คือผมอยากรวมสินค้าให้เข้ามาด้วยกัน ในแต่ละวัน ครับผม
Date :
2019-04-14 09:53:42
By :
sensaiya
คำสั่ง group by มันเหมือน order by ใส่ได้หลาย field
วิเคราะห์ หน่อย อยากแสดงอะไร แยกตามอะไร บ้าง ก็ใส่ group by ไปให้หมด
Date :
2019-04-14 11:56:12
By :
Chaidhanan
ขอบคุณครับผม
Date :
2019-04-20 14:25:18
By :
sensaiya
Load balance : Server 02