 |
อยากทราบวิธีการ select ในเงื่อนไขไตรมาสครับ โดยไตรมาสเป็นแบบงบประมาณราชการ ครับ (กำลังเร่งพัฒนาครับ อีกสองวันน่าจะทำได้) |
|
 |
|
|
 |
 |
|
Code (SQL)
select c.BudgettypeID, sum(b.Clearbillpay), sum(อื่นๆ 1), sum(อื่นๆ 2)
from tbbudgetquarter q
left join tbclearbill b on b.Clearbilldate>=q.Budgetquarterstart and b.Clearbilldate<=q.Budgetquarterend
left join tbbudgetcategory c on c.(ตรงนี้ไม่รู้จะจอยยังไงไม่เห็น ชื่อ field ที่เกีียวข้องกัน 55555)
group by c.BudgettypeID, q.Budgetquarterstart
having q.Budgetquaterstart=ไตรมาสที่ต้องการ
คงได้ประโยชน์บ้างนะครับ
|
ประวัติการแก้ไข 2014-08-09 18:17:44
 |
 |
 |
 |
Date :
2014-08-09 18:17:30 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตาราง ดูแล้ว ผมงง อิอิ ถ้ายังไง Add Line มาละกันนะครับถ้ายังทำไม่ได้ YamQ ครับ
|
 |
 |
 |
 |
Date :
2014-08-09 18:33:02 |
By :
yamcrocodile |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (SQL)
select c.BudgettypeID, q.BudgetquarterID quarter, c.Budgetcategoryamount amt, sum(b.Clearbillpay) pay
from tbbudgetquarter q
left join tbclearbill b on b.Clearbilldate>=q.Budgetquarterstart and b.Clearbilldate<=q.Budgetquarterend
left join tbbudgetcategory c on c.BudgettypeID=b.BudgettypeID
group by c.BudgettypeID, q.BudgetquarterID
ลองดูอีกทีครับ คิวรี่แล้วดูผลของมันครับ คงจะได้ไอเดียเอาไปทำต่อนะครับ
|
 |
 |
 |
 |
Date :
2014-08-09 19:16:19 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
คือว่าถ้าเราไม่ใช้ตาราง ไตรมาส
Select สองตารางแล้วใช้ ฟังก์ชั่นหรือเงื่อนไข ตวรจว่าเป็นไตรมาสอะไรจะได้ไหมครับ
|
 |
 |
 |
 |
Date :
2014-08-09 19:34:24 |
By :
nest12345 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (SQL)
from tbbudgetquarter q
left join tbclearbill b
left join tbbudgetcategory c
เป็น alias (ชื่อเล่น เอาไว้ใช้สำหรับชื่อ table ยาวครับ)
เท่ากับ
Code (SQL)
from tbbudgetquarter AS q
left join tbclearbill AS b
left join tbbudgetcategory AS c
|
ประวัติการแก้ไข 2014-08-09 21:10:02
 |
 |
 |
 |
Date :
2014-08-09 21:09:05 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองใส่ ค่าไตรมาสให้มันอยู่ในช่วงข้อมูล ของ clearbill ด้วยครับ มันจะได้แสดงสมจริงหน่อย
ปล. ไม่ต้องเอามาโชว์นะครบั เดียวจะเอาความลับราชการมาเปิดเผย 5555
|
ประวัติการแก้ไข 2014-08-09 21:15:41
 |
 |
 |
 |
Date :
2014-08-09 21:15:00 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (SQL)
select tbbudgetcategory.BudgettypeID, tbbudgetquarter.BudgetquarterID Quarter, tbbudgetcategory.Budgetcategoryamount amt, sum(tbclearbill.Clearbillpay) pay
from tbbudgetquarter
left join tbclearbill on tbclearbill.Clearbilldate>= tbbudgetquarter.Budgetquarterstart and tbclearbill.Clearbilldate<=tbbudgetquarter.Budgetquarterend
left join tbbudgetcategory on tbbudgetcategory.BudgettypeID=tbclearbill.BudgettypeID
group by tbbudgetcategory.BudgettypeID, tbbudgetquarter.BudgetquarterID
จากโค้ดนี้ รันผ่านแล้วนะครับ แต่ว่า
เรา select โดย ดูเฉพาะค่าเดือน กับ วัน ได้ไหมครับ
คือปี มันเปลี่ยนตลอดอะครับ
|
ประวัติการแก้ไข 2014-08-09 22:16:59
 |
 |
 |
 |
Date :
2014-08-09 22:16:41 |
By :
nest12345 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถ้าไม่ใช้ปีคุมมันจะเอาปีเก่าช่วงเดือนเดียวกันมาด้วยนะสิครับ
|
 |
 |
 |
 |
Date :
2014-08-09 22:21:16 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ไม่จำเปนต้องกังวลกับปี เหลือมกันครับ เราใช้ ปีเดือนวัน ในการเสริช์ อยู่แล้วครับ
ที่ต้องกังวล ถ้าไม่ได้ใช้ปีคุม ปี 2555-10-11 กับ 2556-10-12 มันจะรวมกันเป็นอันเดียวกันนะสิครับ
ถ้าใช้แค่เดือนกับวัน คิวรี่
เปลี่ยน ข้อมูลปีล่ะครั้งน่ะครับ กลัวงานเยอะเหรอครับ 555555 ถึงจะทำหนเดียว
|
 |
 |
 |
 |
Date :
2014-08-09 22:36:30 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถ้าเรียกเป็นเงือนไข ก็ไม่ใช้ ก็ได้ครับ tbbudgetquarter
select c.BudgettypeID, q.quarter, c.Budgetcategoryamount amt, sum(b.Clearbillpay) pay
from (select 1 as quarter, '2012-10-01' qstart, '2012-12-31' qend) q
left join tbclearbill b on b.Clearbilldate between q.start and q.qend
left join tbbudgetcategory c on c.BudgettypeID=b.BudgettypeID
group by c.BudgettypeID, q.quarter
ก็ใช้ตรงสีแดงคุมวันเวลา
หรืออาจจะเพิ่ม ไตรมาสตามชอบก็ได้อีกเหมือนกัน
from (
select 1 as quarter, '2012-10-01' qstart, '2012-12-31' qend
union all
select 2, '2013-01-01', '2013-03-31'
union all
select 3, '2013-04-01', '2013-06-30'
union all
select 4, '2013-07-01', '2013-09-30'
) q
|
ประวัติการแก้ไข 2014-08-09 22:46:30
 |
 |
 |
 |
Date :
2014-08-09 22:45:23 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ยังไงก็เอา A ที่ได้แบ่งมาให้ผมบ้างนะ 55555     
|
 |
 |
 |
 |
Date :
2014-08-09 23:43:41 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ปีหนึ่งก็ไปแก้ตาราง ไตรมาสครั้งหนึ่งสินะครับ
เคยได้ยินคำว่าปฏิทิน ร้อยปีไหมครับ (เกินอายุขัยเฉลี่ยของมนุษย์เช่นเราเราด้วยซ้ำไปครับ)
--- 100 ปี x 4 = 400 ไตรมาส เพราะฉะนั้นตาราง tbbudgetquarter ก็สมเหตุสมผลถ้ามีคนบอกว่า สร้างเอาไว้สัก 200 ปี
|
ประวัติการแก้ไข 2014-08-10 01:11:09
 |
 |
 |
 |
Date :
2014-08-10 01:09:52 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
จาก #NO 5
Code (SQL)
select c.BudgettypeID, q.BudgetquarterID quarter, c.Budgetcategoryamount amt, sum(b.Clearbillpay) pay
from tbbudgetquarter q
left join tbclearbill b on b.Clearbilldate>=q.Budgetquarterstart and b.Clearbilldate<=q.Budgetquarterend
left join tbbudgetcategory c on c.BudgettypeID=b.BudgettypeID
group by c.BudgettypeID, q.BudgetquarterID
มันถูกต้องแล้วครับ ถ้าคุณเข้าใจ/พยายามเข้าใจ
ปล. 1 หรือว่า ๑ หรือคำว่า One มันก็เข้าใจตรงกันครับ ยกเว้นคุณคิดว่า 1 + 1 = 3
|
ประวัติการแก้ไข 2014-08-10 01:43:56
 |
 |
 |
 |
Date :
2014-08-10 01:41:36 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เวลา ณ. ตอนนี้ 03:11 PM +7 ผมคิดว่าคุณคงหลับไปแล้ว (อย่าไปฝืน ผมพูดบ่นบ่นไปอย่างนั้นแหละครับ)
เอา #No20-21 ใส่ลงไปใน #NO12
ปล. A, B, C, D, E, F [color=red]ที่ได้มาก็ไร้ความหมายครับ นี่แหละคืออาชีพโปรแกรมเมอร์ [/color]
|
ประวัติการแก้ไข 2014-08-10 03:20:07
 |
 |
 |
 |
Date :
2014-08-10 03:16:53 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
, sum(b.Clearbillpay) pay
แก้เป็น
, sum(COALESE( b.Clearbillpay, 0) ) pay
จากที่ผมเคยเขียน statement แล้วให้ลอง ทำดูจะได้มีไอเดียต่อไป (คห 5)
Code (SQL)
select c.BudgettypeID, q.BudgetquarterID quarter, c.Budgetcategoryamount amt, sum(b.Clearbillpay) pay
from tbbudgetquarter q
left join tbclearbill b on b.Clearbilldate>=q.Budgetquarterstart and b.Clearbilldate<=q.Budgetquarterend
left join tbbudgetcategory c on c.BudgettypeID=b.BudgettypeID
group by c.BudgettypeID, q.BudgetquarterID
ลองสร้าง table จำลอง tbClearbillpay มา แล้วใส่ ข้อมูลให้ ครบ ทุกไตรมาส ดูครับ จะได้เห็นรายละเอียด
ของ statement ว่ามันให้ผลลัพธ์ออกมาอย่างไร
|
ประวัติการแก้ไข 2014-08-10 14:17:52
 |
 |
 |
 |
Date :
2014-08-10 14:12:10 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เข้ามาฟังเพลง
|
 |
 |
 |
 |
Date :
2014-08-10 16:32:48 |
By :
Krungsri |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|

ผมจะ selelect ยังไงดีครับ ส่วนนี้ผม คิดไม่ออกจริงครับ
พอมีไกดให้ ไหมครับ
ผมอยากรู้วิธี select ให้ ได้ ตามตารางนี้ อะครับ T^T
Code (SQL)
SELECT tbbudgetcategory.BudgettypeID, tbbudgettype.Budgettype,tbbudgetcategory.Budgetcategoryamount เงินต้น,ABS( SUM( tbclearbill.Clearbillpayer ) - Budgetcategoryamount ) AS เงินคงเหลือ, SUM( tbclearbill.Clearbillpayer ) ไตรมาส1
FROM tbbudgetquarter
LEFT JOIN tbclearbill ON tbclearbill.Clearbilldate >= tbbudgetquarter.Budgetquarterstart
AND tbclearbill.Clearbilldate <= tbbudgetquarter.Budgetquarterend
LEFT JOIN tbbudgetcategory ON tbbudgetcategory.BudgettypeID = tbclearbill.BudgettypeID
LEFT JOIN tbbudgettype ON tbbudgetcategory.BudgettypeID = tbbudgettype.BudgettypeID
WHERE tbbudgetcategory.BudgetyearID = 41
GROUP BY tbbudgetcategory.BudgettypeID
ผมมีเงื่อนไข select ไตรมาสทั้ง 4 ไตรมาสแล้วนะครับ
เราจะเอามาใส่ ในคำสั่ง SELECT ยังไงดีครับ
Code (SQL)
" BETWEEN '$yeareng2-10-1' AND '$yeareng2-12-31' ";
"BETWEEN '$yeareng-01-1' AND '$yeareng-03-31' ";
"BETWEEN '$yeareng-04-1' AND '$yeareng-06-30' ";
"BETWEEN '$yeareng-07-1' AND '$yeareng-09-30' ";


|
ประวัติการแก้ไข 2014-08-10 21:20:17 2014-08-10 21:21:30 2014-08-10 21:26:01
 |
 |
 |
 |
Date :
2014-08-10 21:12:51 |
By :
nest12345 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (PHP)
<?php
// ae.php
$qr="select c.BudgettypeID ID, q.BudgetquarterID quarter, c.Budgetcategoryamount amt
, sum(COALESCE( b.Clearbillpay, 0) ) pay
from tbbudgetquarter q
left join tbclearbill b on b.Clearbilldate>=q.Budgetquarterstart and b.Clearbilldate<=q.Budgetquarterend
left join tbbudgetcategory c on c.BudgettypeID=b.BudgettypeID
group by c.BudgettypeID, q.BudgetquarterID";
$mysql=new mysqli('host', 'user', 'pass', 'dbname');
$rs=$mysql->query($qr); $old_typeID='';
$row=array(); $tr=''; $idx=-1;
while($ro=$rs->fetch_assoc() ){
$pay=(int)$ro['pay']; $typeID=$ro['ID'];
if($old_typeID!=$typeID){
$idx++;
$row[$idx]=array(
'TypeID'=>$typeID, 'Budget'=>$ro['amt'],
'pay1'=>$pay, 'pay2'=>0, 'pay3'=>0, 'pay4'=>0,
'allpay'=>$pay
);
$old_typeID=$typeID;
}else{
$row[$idx]['pay'.$ro['quarter']]=$pay;
$row[$idx]['allpay'] += $pay;
}
}
print_r($row);
?>
คงเอาตัวแปร array $row ไปใช้ได้นะครับ ถ้าเอาไปใช้ไม่ได้ ผมให้ F ทันทีเลย 55555
|
ประวัติการแก้ไข 2014-08-10 21:48:02 2014-08-10 21:51:11 2014-08-10 23:35:18
 |
 |
 |
 |
Date :
2014-08-10 21:47:13 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ดูรหัสต้นฉบับครับ ว่ามันให้อะไรมาบ้าง
|
 |
 |
 |
 |
Date :
2014-08-10 22:28:15 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตามสบายครับ ถ้าเห็น result array ที่ได้แล้วจะถอยหลังไปเรียนใหม่ ผมก็ไม่มีอะไรจะว่าล่ะครับ
ถือว่าศึกษาไปก็แล้วกันครับ วันนี้ไปนอนล่ะครับ
|
 |
 |
 |
 |
Date :
2014-08-10 22:57:16 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมมีวิธีมาเสนอไม่รู้ว่าจะสนใจเปล่า เป็นวิธีดิบๆที่ผมเอาไว้ใช้เมื่อผมคิดคิวรี่ชั้นสูงไม่ออก 5 5 5
SELECT มันธรรมดานี่เหละ ค่อยๆไล่ไปทีละตารางอาศัย loop และการคิวรี่หลายๆรอบเข้าช่วย มันทำให้เราแตกประเด็นอะไรได้เยอะมากเลย ถ้าจะทำก็เอากระดาษมาจด ต้องการแบบนี้นะ ตัวนี้วิ่งมาจากไหนเกิดจากอะไร ไปไล่มาจากต้นตอของมัน คิวรี่มันทีละตารางใช้ loop ซ้อน loop บางทีผมคิวรี่ 10 ตารางผมซ้อน loop เอาล้วนๆ ไม่มี join/มีอะไรที่มันทำให้ปวดหัว โค้ดอ่านง่ายแต่มันจะวกวนและยาวไปหน่อย ..... เวลาหาบัคหาง่ายนะเออ เพราะโค้ดมันไล่กันเป็นสเต็บๆเป็นชั้นชั้นเลยถ้ามอง loop ออก ก็ตีโจทย์แตก 
ปล.ไม่จำเป็นจริงๆผมไม่เขียนคำสั่ง join ผมยอมเขียนโค้ดที่ยืดยาวและวกวน ดีกว่าโค้ดที่สั้นแต่อธิบายตัวเองได้ยาก
|
ประวัติการแก้ไข 2014-08-11 04:30:59
 |
 |
 |
 |
Date :
2014-08-11 04:27:57 |
By :
meannerss |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|