จัดการข้อมูลนี้อย่างไรครับ
กระทู้เก่าบอร์ด อ.Yeadram

 3,574   15
URL.หัวข้อ / URL
จัดการข้อมูลนี้อย่างไรครับ


ต้องการสรุปใบเสร็จครับ

15 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R15200
อธิบายเพิ่มสิ่งที่ต้องการครับ ตารางที่ 1 สรุปผลอย่างนี้ครับ
12/2/56   16158    10101   7-9
12/2/56   16158    10102   10-10
12/2/56   16158    10101   11-12
12/2/56   16158    10102   13-13
12/2/56   16158    10101   14-17
หรือ
12/2/56   16158    10101   7-9,11-12,14-17
12/2/56   16158    10102   10,13
ลองใช้ค่า min max แล้วข้อมูลซ้ำ



2 @R15221
รูปน่าจะกลายเป็นรูปอื่นไปแล้วนะครับ
ดูจากข้อมูล เข้าใจอยากมากเลยครับ

คำถาม
จากข้อมูลเดิม
12/2/56   16158    10101   7-9
12/2/56   16158    10102   10-10
12/2/56   16158    10101   11-12
12/2/56   16158    10102   13-13
12/2/56   16158    10101   14-17

แล้วถ้าเปลี่ยนการเรียงเรคคอร์ดเป็นแบบนี้ ผลที่ต้องการก็จะเป็นดังนี้หรือเปล่า
12/2/56   16158    10101   7-12
12/2/56   16158    10102   10-13
12/2/56   16158    10101   14-17

แล้วเลข 16158 มันมีผลยังไงกับการเรียงหรือการนับหรือไม่ คือดูคำถามแล้วสับสนครับ ถามใหม่ดีกว่าครับขอละเอียดหน่อยครับ งง มาก
3 @R15230
จากตารางเดิมข้อมูลเป็นแบบนี้ครับ
วันที่ออกใบเสร็จ    เล่มที่ใบเสร็จ   ประเภทรายรับ   เลขที่ใบเสร็จ
12/12/56              16158             10101                  7
12/12/56              16158             10101                  8
12/12/56              16158             10101                  9
12/12/56              16158             10102                  10
12/12/56              16158             10101                  11
12/12/56              16158             10101                  12
12/12/56              16158             10102                  13
12/12/56              16158             10101                  14
12/12/56              16158             10101                  15
12/12/56              16158             10101                  16
12/12/56              16158             10101                  14

สิ่งที่ต้องการครับ ตารางที่ 1 สรุปผลออกมาเป็นแบบนี้ครับ
วันที่รับ      เลขที่ใบเสร็จ ประเภทรายรับ        เลขที่
12/2/56      16158             10101               7-9
12/2/56      16158             10102             10-10
12/2/56      16158             10101             11-12
12/2/56      16158             10102             13-13
12/2/56      16158             10101             14-17
หรือ
12/2/56      16158             10101   7-9,11-12,14-17
12/2/56      16158             10102   10,13
4 @R15233
อธิบายแนวคิดให้หน่อยนะครับ ผมดูแล้วเรคคอร์ดข้อมูลเหมือนกันหมด แต่จะให้แบ่ง เลขที่ เป็นช่วงๆ จะยึดอะไรเป็นตักกะในการแยกข้อมูลครับ
5 @R15234
ลองนั่งเขียนคิวรี่ดู ได้แต่อย่างนี้อ่ะครับ
วันที่รับ      เลขที่ใบเสร็จ ประเภทรายรับ        เลขที่
12/2/56      16158             10101               7-9
12/2/56      16158             10102             10-10
12/2/56      16158             10101             7-12
12/2/56      16158             10102             10-13
12/2/56      16158             10101             7-17

ยังคิดไม่ออกว่าจะหาค่า Min ของ เลขที่ใบเสร็จ เป็นช่วงๆ ในขณะที่ฟิลด์อื่นๆมีค่าเหมือนกันหมดได้อย่างไร เราจะอ้างค่า Min อีกช่วงได้อย่างไร
6 @R15241
เขียน vba วนลูปเอา ง่ายกว่า ใช้ query เยอะเลยครับ
7 @R15242
ทำเป็น Query ให้ดูครับ

เงื่อนไข: เลขที่ใบเสร็จต้องเป็นเลข running ต่อเนื่องกันเท่านั้น!

สมมุติว่าตารางของคุณชื่อว่า t_Bill

1. สร้าง query ชื่อ Bill_Min
Select วันที่ออกใบเสร็จ, เล่มที่ใบเสร็จ, ประเภทรายรับ, เลขที่ใบเสร็จ
From t_Bill AS b1
Where เลขที่ใบเสร็จ =
(
Select Max(เลขที่ใบเสร็จ) +1
From t_Bill as b2
Where b2.ประเภทรายรับ <> b1.ประเภทรายรับ
And b2.เลขที่ใบเสร็จ < b1.เลขที่ใบเสร็จ
)

2. สร้าง query ชื่อ Bill_All_Min
(
Select วันที่ออกใบเสร็จ, เล่มที่ใบเสร็จ, ประเภทรายรับ, เลขที่ใบเสร็จ
From t_Bill as a1
Where เลขที่ใบเสร็จ =
(
Select Min(เลขที่ใบเสร็จ)
From t_Bill as a2
)
)
Union
(
Select * From Bill_Min
)

3. สร้าง query ชื่อ Bill_All_Max
(
Select * From Bill_Min
)
Union
(
Select วันที่ออกใบเสร็จ, เล่มที่ใบเสร็จ, 99999, เลขที่ใบเสร็จ+1
From
(
Select *
From t_Bill AS c1
Where เลขที่ใบเสร็จ =
(
Select Max(เลขที่ใบเสร็จ)
From t_Bill as c2
)
)
)

4. สร้าง query ขื่อ Bill_Final
Select วันที่ออกใบเสร็จ, เล่มที่ใบเสร็จ, ประเภทรายรับ, เลขที่ใบเสร็จ & "-" &
(Select Min(เลขที่ใบเสร็จ) - 1
From
Bill_All_Max As amax
Where amax.ประเภทรายรับ <> amin.ประเภทรายรับ
And amax.เลขที่ใบเสร็จ > amin.เลขที่ใบเสร็จ
) As เลขที่
From Bill_All_Min AS amin
Order By เลขที่ใบเสร็จ

Open Query Bill_Final ครับ
8 @R15244
โห! เยี่ยมเลยครับผม
9 @R15249
ทำไม่ได้เนื่องจากความรู้น้อยครับ มีตัวอย่างคิวรี่ที่ทำเสร็จแล้วเป็นตัวอย่างบ้านไหมครับ
10 @R15251
@ คุณนิคม
จากข้อ 1-4 ที่ อ.PichaiTC เขียนไว้ คือให้คุณ สร้างคิวรี่ขึ้นมาใหม่ ข้อละ 1 คิวรี่ ไม่ต้อง Add ตารางใดๆทั้งสิ้น เข้าไปที่มุมมอง SQL แล้ว Copy โค๊ดทีละข้อ ใส่ลงไปที่ละคิวรี่ ตั้งชื่อตามที่เขียนไว้ เช่น คิวรี่ 1 ชื่อ Bill_Min คิวรี่ 2 ชื่อ Bill_All_Min ...
และในโค๊ดจะใช้ชื่อตารางว่า t_Bill ให้เปลี่ยนทุกข้อความที่เขียนว่า t_Bill เป็นชื่อตารางของคุณ
สุดท้ายเมื่อทำครบทั้ง 4 คิวรี่แล้ว เรียกที่คิวรี่ชื่อ Bill_Final อันเดียวพอ จะเห็นการสรุปข้อมูลที่คุุณต้องการ ประมาณนี้ครับ
11 @R15253
ลองทำตามคำแนะนำแล้วครับ แล้วลองเพิ่มข้อมูลในตาราง t_Bill
วันที่ออกใบเสร็จ เล่มที่ใบเสร็จ ประเภทรายรับ เลขที่ใบเสร็จ
5/2/2556               16158                 10101                     1
5/2/2556               16158                 10101                     2
5/2/2556               16158                 10101                     3
7/2/2556               16158                 10101                     4
11/2/2556             16158                 10101                     5
11/2/2556             16158                 10102                     6
12/2/2556             16158                 10101                     7
12/2/2556             16158                 10101                     8
12/2/2556             16158                 10102                     9
12/2/2556             16158                 10101                     10
12/2/2556             16158                 10101                     11
13/2/2556             16157                 10101                     1
13/2/2556             16157                 10101                     2
13/2/2556             16157                 10101                     3
13/2/2556             16158                 10102                     12
13/2/2556             16158                 10102                     13
13/2/2556             16158                 10102                     14
ผลที่ควรจะได้คือ
5/2/2556               16158                 10101                     1-3
7/2/2556               16158                 10101                     4-4
11/2/2556             16158                 10101                     5-5
11/2/2556             16158                 10102                     6-6
12/2/2556               16158                 10101                     7-8
12/2/2556               16158                 10102                     9-9
12/2/2556               16158                 10101                     10-11
13/2/2556               16157                 10101                    1-3
13/2/2556               16158                 10102                    12-13
ผลที่ได้จาก Query
วันที่ออกใบเสร็จ เล่มที่ใบเสร็จ ประเภทรายรับ เลขที่ใบเสร็จ
13/2/2556               16157                 10101                     1-5
5/2/2556                 16158                 10101                     1-5
11/2/2556               16158                 10102                     6-6
12/2/2556               16158                 10101                     7-8
12/2/2556               16158                 10102                     9-9
12/2/2556               16158                 10101                     10-11
13/2/2556               16158                 10102                     12-14

หมายเหตุ ที่ทำงานมีใบเสร็จมากกว่า 1 เล่ม และมี ประเภทรายรับมากว่า 1 ประเภท
12 @R15254
แจ้งข้อมูลมาช้าไปหน่อยนะครับ
ผมใช้เวลา 3 ชั่วโมง กว่าจะเขียนให้ได้ผลสำเร็จ
คงต้องรอผมมีเวลาว่างก่อนนะครับ

แต่ที่จริง query ที่ให้ไปก็ถูกทางอยู่แล้ว
ใครอยากลองคิดต่อ ก็ลองดู แล้วเอาผลมาให้ดูหน่อยนะครับ
13 @R15263
คุณนิคมครับ ผมบอกเลยนะครับว่านี่เป็นปัญหาของการที่คุณให้ข้อมูลไม่ครบอ่ะครับ และไม่ได้บอกแนวคิดในความต้องการสรุปการแบ่งข้อมูล ทำให้การเขียนคิวรี่เงื่อนไขตกไป เมื่อเทียบกับข้อมูลใหม่ที่คุณให้มา จริงๆผู้ถามควรให้ข้อมูลมากหน่อยนะครับ พยายามนึกเรียบเรียงหน่อยนะครับ เห็น อ.PichaiTC เขียนไว้ว่าใช้เวลา 3 ชั่วโมงแล้ว ผมบอกตรงๆว่าผมยังรู้สึกเหนื่อยและเกรงใจแทนเลยครับ ขอบ่นหน่อยก่อนเข้าเรื่อง

คิวรี่ที่ 2 ที่ชื่อ Bill_All_Min เปลี่ยนเป็น
(SELECT [วันที่ออกใบเสร็จ], [เล่มที่ใบเสร็จ], [ประเภทรายรับ], [เลขทีใบเสร็จ]
FROM t_Bill AS a1
WHERE [เลขทีใบเสร็จ] = (SELECT Min([เลขทีใบเสร็จ]) FROM t_Bill AS a2
WHERE a2.[เล่มที่ใบเสร็จ] = a1.[เล่มที่ใบเสร็จ] AND a2.[วันที่ออกใบเสร็จ] = a1.[วันที่ออกใบเสร็จ]))
UNION (SELECT * FROM Bill_Min);


คิวรี่ที่ 3 ที่ชื่อ Bill_All_Max เปลี่ยนเป็น
(SELECT * FROM Bill_Min)
UNION (SELECT [วันที่ออกใบเสร็จ], [เล่มที่ใบเสร็จ], (SELECT Max([ประเภทรายรับ]) + 1 FROM t_Bill), [เลขทีใบเสร็จ] + 1
FROM (SELECT * FROM t_Bill AS c1
WHERE [เลขทีใบเสร็จ] = (SELECT Max([เลขทีใบเสร็จ])
FROM t_Bill AS c2
WHERE c2.[เล่มที่ใบเสร็จ] = c1.[เล่มที่ใบเสร็จ]
AND c2.[วันที่ออกใบเสร็จ] = c1.[วันที่ออกใบเสร็จ])));

คิวรี่ที่ 4 ที่ชื่อ Bill_Final เปลี่ยนเป็น
SELECT amin.[วันที่ออกใบเสร็จ], amin.[เล่มที่ใบเสร็จ], amin.[ประเภทรายรับ], [เลขทีใบเสร็จ] & "-" &
(SELECT Min([เลขทีใบเสร็จ]) - 1 FROM Bill_All_Max AS amax
WHERE amax.[ประเภทรายรับ] <> amin.[ประเภทรายรับ]
AND amax.[เลขทีใบเสร็จ] > amin.[เลขทีใบเสร็จ]) AS [เลขที่ Min-Max]
FROM Bill_All_Min AS amin
ORDER BY amin.[วันที่ออกใบเสร็จ], amin.[เลขทีใบเสร็จ];

คือการเพิ่มเงื่อนไขฟิลด์ วันที่ และ เล่มที่ จะต้องเท่ากันดัวย

ผลลัพธ์
5/2/2556               16158                 10101                     1-3
7/2/2556               16158                 10101                     4-4
11/2/2556             16158                 10101                     5-5
11/2/2556             16158                 10102                     6-6
12/2/2556               16158                 10101                     7-8
12/2/2556               16158                 10102                     9-9
12/2/2556               16158                 10101                     10-11
13/2/2556               16157                 10101                    1-3
13/2/2556               16158                 10102                    12-14

- ผลที่ควรจะได้ ของคุณ บรรทัดสุดท้ายต้องเป็น 12-14 นะครับ ไม่ใช่ 12-13 จากข้อมูล ตารางที่คุณเขียนมา

ปล. ขออนุญาติอาจารย์ ตอบแทนนะครับ
14 @R15276
ขอบคุณครับ โอกาสหน้าจะอธิบายให้ละเอียดมากกว่าเดิมครับ
ปกติทำได้แค่ คิวรี่ เบื้องตน แต่เขียน SQL ไม่เป็นครับ แล้วถ้าอยากเขียน SQL ได้ ต้องเริ่มต้นอย่างไรครับ อ่านที่เขียนมาให้ยังไม่เข้าใจเลยครับ ได้แต่ Copy ไปทำตามเองครับ
15 @R15286
ผมเห็นตามร้านหนังสือ รู้สึกจะมีที่เขียนมาเน้นเฉพาะเรื่องของ SQL หรือ VBA เป็นหลัก ลองซื้อมาอ่านดูครับ หรือไม่ก็ตามเว็บทั่วไป ศึกษาเรื่องพื้นฐานคำสั่งหลักๆก่อนครับ ดูว่ามีรูปแบบการเขียนแต่ละคำสั่งอย่างไร
ลองดูที่นี่ก็ได้ครับ
http://www.w3schools.com/sql/sql_syntax.asp
เป็นตัวอย่างแบบพื้นฐานเลย แต่เว็บนี้เค้าจะเขียนรวมระหว่าง SQL Server / MS Access / My SQL / Oracle โดยคำสั่งไหนใช้ไม่เหมือนกันก็จะบอกไว้ แต่หลักๆ 80-90 เปอร์เซ็น ใช้กับ MS Access ได้ครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.4511s