เนื้อหาต่อไปนี้เป็นแนวทางการประยุกต์การแสดงข้อมูล โดยทำการแทรกส่วนการแสดง
ผลรวมข้อมูลของแต่ละชุดข้อมูล ในที่นี้จะอ้างอิงจากวันที่ สามารถนำไปประยุกต์เป็นกรณี
อื่นๆ ได้
คำสั่ง sql ตารางสำหรับทดสอบ
-- -- Table structure for table `tbl_sale` -- CREATE TABLE IF NOT EXISTS `tbl_sale` ( `sale_id` int(11) NOT NULL, `sale_date` date NOT NULL, `sale_name` varchar(50) NOT NULL, `sale_product` varchar(50) NOT NULL, `sale_price` int(11) NOT NULL, `sale_com` int(11) NOT NULL ) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; -- -- Dumping data for table `tbl_sale` -- INSERT INTO `tbl_sale` (`sale_id`, `sale_date`, `sale_name`, `sale_product`, `sale_price`, `sale_com`) VALUES (1, '2015-07-01', 'Seller A', 'Product A', 300, 60), (2, '2015-07-01', 'Seller A', 'Product B', 450, 90), (3, '2015-07-01', 'Seller B', 'Product B', 450, 90), (4, '2015-07-02', 'Seller A', 'Product C', 550, 110), (5, '2015-07-02', 'Seller B', 'Product E', 550, 110), (6, '2015-07-02', 'Seller B', 'Product F', 700, 140), (7, '2015-07-03', 'Seller A', 'Product G', 400, 80); -- -- Indexes for dumped tables -- -- -- Indexes for table `tbl_sale` -- ALTER TABLE `tbl_sale` ADD PRIMARY KEY (`sale_id`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `tbl_sale` -- ALTER TABLE `tbl_sale` MODIFY `sale_id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=8;
ตารางสำหรับทดสอบ
| Date | Product | Price | Com. |
|---|---|---|---|
| 2015-07-01 | Product A | 300 | 60 |
| 2015-07-01 | Product B | 450 | 90 |
| 2015-07-01 | Product B | 450 | 90 |
| 2015-07-02 | Product C | 550 | 110 |
| 2015-07-02 | Product E | 550 | 110 |
| 2015-07-02 | Product F | 700 | 140 |
| 2015-07-03 | Product G | 400 | 80 |
จากตัวอย่างตาราง จะเป็นตาราง tbl_sale แสดงรายการขายของ สินค้า แสดง
ชื่อสินค้า ราคา และ คอมมิชชั่น 2% ของราคาขาย
สิ่งที่เราต้องการคือ ต้องการแสดงผลรวมราคา หรือยอดขายในแต่ละวัน และค่าคอมมิชชั่นในแต่ละวัน
รวมทั้งผลรวมสะสมของทั้งสองรายการในแต่ละวันด้วย
ผลที่ได้
| Date | Product | Price | Com. |
|---|---|---|---|
| 2015-07-01 | Product A | 300 | 60 |
| Product B | 450 | 90 | |
| Product B | 450 | 90 | |
| รวมรายวัน | 1200 | 240 | |
| รวมสะสม | 1200 | 240 | |
| 2015-07-02 | Product C | 550 | 110 |
| Product E | 550 | 110 | |
| Product F | 700 | 140 | |
| รวมรายวัน | 1800 | 360 | |
| รวมสะสม | 3000 | 600 | |
| 2015-07-03 | Product G | 400 | 80 |
| รวมรายวัน | 400 | 80 | |
| รวมสะสม | 3400 | 680 |
ต่อไปจะเป็นกรณีการใช้งานกับฐานข้อมูล
โดยเราจะใช้วิธีการเชื่อมต่อแบบ
mysqli แทน mysql ธรรมดา เพื่อรองรับในอนาคต
ดาวน์โหลดไฟล์ พร้อมใช้ ชื่อ db_connect.php ได้ที่
โค้ดตัวอย่างทั้งหมด คำอธิบายแสดงในโค้ด
<?php
include("db_connect.php"); // เรียกใช้ไฟล์ ตั้งค่า และฟังก์ชั่น เกี่ยวกับฐานข้อมูล
$mysqli = connect(); // สร้าง ตัวแปร mysqli instance สำหรับเรียกใช้งานฐานข้อมูล
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body>
<br>
<br>
<br>
<div style="margin:auto;width:80%;">
<br>
<br>
<table class="table table-bordered table-condensed" style="width:550px;">
<thead>
<tr class="bg-success">
<th>Date</th>
<th>Product</th>
<th>Price</th>
<th>Com.</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=[];
$q="
SELECT * FROM tbl_sale ORDER BY sale_date
";
$rs=$mysqli->query($q);
$total=$rs->num_rows;
while($data=$rs->fetch_assoc()){
$show_row_end=0; // เริ่มต้นการแบ่ง กำหนดเป็น 0
// จัดรูปแบบ key วันที่ที่จะใช้เก็บข้อมูล (หากไม่ได้ใช้วันที่ ประยุกต์เป็นอย่างอื่นตามต้องการ)
$dateKey=date("dmY",strtotime($data['sale_date']));
/// ส่วนของการกำนหด การเปรียบค่าของรายการ เพื่อแบ่งวันที่เป็นสัดส่วน
$temp_data1=$data['sale_date'];
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['sale_date'];
// ถ้าไม่ใช้ข้อมูลรายการแรก และ ข้อมูลวันที่รายการก่อนหน้า ไม่เท่ากับรายการที่กำลังแสดง
// นั่นหมายถึงจุดที่เราจะกำหนดว่า เป็นรายการสุดท้ายของวันที่หนึ่งๆ
if($i>1 && $arr_dateCheck[$i-1]!=$data['sale_date']){
// กำหนด 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['sale_price']); // และเพิ่มค่า
}else{
array_push($data_price[$dateKey],$data['sale_price']); // เพิ่มค่าใน array
}
if(!isset($data_com[$dateKey])){
$data_com[$dateKey]=[];
array_push($data_com[$dateKey],$data['sale_com']);
}else{
array_push($data_com[$dateKey],$data['sale_com']);
}
?>
<?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['sale_date']?>
<?php } ?>
</td>
<td><?=$data['sale_product']?></td>
<td><?=$data['sale_price']?></td>
<td><?=$data['sale_com']?></td>
</tr>
<?php if(
// สำหรับแทรก กรณีเป็นรายการสุดท้ายในตาราง
$i==$total){?>
<?php
// รายการสุดท้าย กำหนด key เช็คเป็นค่าที่รูปแบบตรงกัน
$dateKeyCheck=date("dmY",strtotime($data['sale_date']));
// รวมค่าข้อมูลแต่ละวัน แล้วเพิ่มเข้าไปใน 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>
</div>
</body>
</html>
เนื้อหาส่วนนี้ค่อนข้างซับซ้อนและมีรูปแบบการใช้งานที่จำเป็นต้องทำความเข้าใจ
สามารถนำไปประยุกต์กับรูปแบบ หรือตารางอื่นๆ ได้