กระทู้เก่าบอร์ด อ.Yeadram
2,733 10
URL.หัวข้อ /
URL
การ select Cross TAB
ไม่แน่ใจว่าคำว่า CrossTab ถูกต้องหรือเปล่า
ข้อมูล
1 a
1 b
2 c
2 d
2 e
ต้องการ
1 a,b
2 c,d,e
ต้องใช้ SQL อย่างไรครับ ขอบคุณมากครับ
ข้อมูล
1 a
1 b
2 c
2 d
2 e
ต้องการ
1 a,b
2 c,d,e
ต้องใช้ SQL อย่างไรครับ ขอบคุณมากครับ
10 Reply in this Topic. Dispaly 1 pages and you are on page number 1
1 @R08493
รบกวนท่าน เซียนๆ Access ด้วยครับ ลองหามาสองวันแล้ว
2 @R08494
มันไม่ใช่การใช้ Cross Tab ครับ
ข้อมูลในฟิลด์ที่จะนำมา Pivot ได้ต้องเป็น number ครับหรือถ้ามันเป็น string เต็มที่ก็ทำได้แค่การนับครับ ซึ่งผลการนับมันก็เป็น number อีกนั่นแหละครับ
หรือมันต้องเป็น ผลจากฟังก์ชั่นกลุ่ม Agregate เช่น ผลจากการ
count, sum, avg, min, max เป็นต้น คือในหลายๆ ข้อมูลให้กระทำอย่างใดอย่างหนึ่งก่อน เพื่อจะให้เหลือคำตอบเดียว
แต่ตัวอย่างของคุณมันทำไม่ได้ อย่างข้อมูลในกลุ่ม เลข 2 มันมี c d e ซึ่งสามข้อมูลนี้ คุณจะให้มันมาเขียนต่อกัน (มันก็เหลือคำตอบเดียวก็จริง คือเป็น string แค่ชุดเดียว) แต่มันผิดหลักของมันครับ เพราะไม่มีฟังก์ชั่นในกลุ่ม agregate สามารถทำได้
จะเอา c d e มาบวกมันก็ไม่ได้ จะเอามาหาค่าเฉลี่ยก็ไม่ได้
ดังนั้นงานของคุณใช้ Cross Tab ไม่ได้ครับ
ถ้าข้อมูลไม่เยอะมาก (เกินกว่ากำลังการประมวลผลของซีพียู และแรมของคุณ) ก็อาจจะใช้วิธีเขียนเป็นฟังก์ชั่นเอาเองครับ
ข้อมูลในฟิลด์ที่จะนำมา Pivot ได้ต้องเป็น number ครับหรือถ้ามันเป็น string เต็มที่ก็ทำได้แค่การนับครับ ซึ่งผลการนับมันก็เป็น number อีกนั่นแหละครับ
หรือมันต้องเป็น ผลจากฟังก์ชั่นกลุ่ม Agregate เช่น ผลจากการ
count, sum, avg, min, max เป็นต้น คือในหลายๆ ข้อมูลให้กระทำอย่างใดอย่างหนึ่งก่อน เพื่อจะให้เหลือคำตอบเดียว
แต่ตัวอย่างของคุณมันทำไม่ได้ อย่างข้อมูลในกลุ่ม เลข 2 มันมี c d e ซึ่งสามข้อมูลนี้ คุณจะให้มันมาเขียนต่อกัน (มันก็เหลือคำตอบเดียวก็จริง คือเป็น string แค่ชุดเดียว) แต่มันผิดหลักของมันครับ เพราะไม่มีฟังก์ชั่นในกลุ่ม agregate สามารถทำได้
จะเอา c d e มาบวกมันก็ไม่ได้ จะเอามาหาค่าเฉลี่ยก็ไม่ได้
ดังนั้นงานของคุณใช้ Cross Tab ไม่ได้ครับ
ถ้าข้อมูลไม่เยอะมาก (เกินกว่ากำลังการประมวลผลของซีพียู และแรมของคุณ) ก็อาจจะใช้วิธีเขียนเป็นฟังก์ชั่นเอาเองครับ
3 @R08495
หรือลองใช้วิธีนี้ก็ได้ครับ
สมมติให้ข้อมูลของคุณมีข้อมูลดังตัวอย่าง
ชื่อตารางคือ Table1
ฟิลด์แรก ให้ชื่อฟิลด์ว่า field1
ฟิลด์ที่สองให้ชื่อฟิลด์ว่า field2
ให้ไปสร้างฟิลด์เพิ่มมา 1 ฟิลด์ ชื่อฟิลด์ว่า id ให้เป็น Autonumber
คุณลอง เอา statement ชุดนี้ไปวางทำเป็นคิวรี่ดูครับ
ดูว่าพอรับได้หรือเปล่า ** ระวังบรรทัดสุดท้าย ตัวเลขที่เรียงกันอยู่นั่น อาจจะทำให้คุณเกิดปัญหาบางอย่าง อธิบายยาก ลองเล่นกับมันดูก็แล้วกันครับ
ถ้าไม่สามารถยอมรับกับผลของมันได้ หรือไม่สามารถนำไปประยุกต์ต่อยอดได้ ก็ขอแนะนำตามความเห็นข้างต้นครับ เขียนเป็นฟังก์ชั่นเลยดีกว่า
สมมติให้ข้อมูลของคุณมีข้อมูลดังตัวอย่าง
ชื่อตารางคือ Table1
ฟิลด์แรก ให้ชื่อฟิลด์ว่า field1
ฟิลด์ที่สองให้ชื่อฟิลด์ว่า field2
ให้ไปสร้างฟิลด์เพิ่มมา 1 ฟิลด์ ชื่อฟิลด์ว่า id ให้เป็น Autonumber
คุณลอง เอา statement ชุดนี้ไปวางทำเป็นคิวรี่ดูครับ
ดูว่าพอรับได้หรือเปล่า ** ระวังบรรทัดสุดท้าย ตัวเลขที่เรียงกันอยู่นั่น อาจจะทำให้คุณเกิดปัญหาบางอย่าง อธิบายยาก ลองเล่นกับมันดูก็แล้วกันครับ
TRANSFORM First(Q.field2) AS FirstOffield2
SELECT Q.field1
FROM (SELECT (select count(field1) from Table1 as AA where AA.field1 = Table1.field1 and AA.id < Table1.id)+1 AS Rnn, Table1.field1, Table1.field2
FROM Table1) AS Q
GROUP BY Q.field1
PIVOT Q.Rnn In (1,2,3);
ถ้าไม่สามารถยอมรับกับผลของมันได้ หรือไม่สามารถนำไปประยุกต์ต่อยอดได้ ก็ขอแนะนำตามความเห็นข้างต้นครับ เขียนเป็นฟังก์ชั่นเลยดีกว่า
4 @R08498
ขอคำแนะนำการเขียน ฟังชั่นครับ ว่า ต้องทำอย่างไรครับ
พอดี เห็นว่ามัน น่าจะทำได้ ด้วยคำสั่ง SQL
พอดี เห็นว่ามัน น่าจะทำได้ ด้วยคำสั่ง SQL
5 @R08499
ลองดูแล้ว ทำ Query ต่อเอามารวมกันได้ครับ แจ๋วเลยครับ ท่านใดมีไอเดียอื่นอีกไม๊ครับ
6 @R08500
ทำได้แล้วครับ ขอบคุณมากครับ ไม่น่าเชื่อว่า Access ทำได้ครับ
ขอบคุณอีกครั้งครับ เป็น SQL เฉพาะ Access wไช่ไม๊ครับ ไม่ไช่ SQL/92
ขอบคุณอีกครั้งครับ เป็น SQL เฉพาะ Access wไช่ไม๊ครับ ไม่ไช่ SQL/92
7 @R08542
code ตัวนี่มันคืออะไรครับ ช่วยอธิบายหน่อยครับ เพราะผมติดตัวนี่อยู่
select count(field1) from Table1 as AA where AA.field1 = Table1.field1 and AA.id < Table1.id)+1 AS Rnn
8 @R08545
มันเป็น sub query นะครับ คุณ dondonkey เอามาไม่ครบครับ
อธิบายไป มันจะผิด
อันนี้คือ ทั้งหมด
SELECT (select count(field1) from Table1 as AA where AA.field1 = Table1.field1 and AA.id < Table1.id)+1 AS Rnn, Table1.field1, Table1.field2
FROM Table1;
เป็นการ สร้างลำดับที่ครับ คือสร้างลำดับที่ ให้แต่ละเรคคอร์ดในกลุ่มเดียวกันครับ
อธิบายไป มันจะผิด
อันนี้คือ ทั้งหมด
SELECT (select count(field1) from Table1 as AA where AA.field1 = Table1.field1 and AA.id < Table1.id)+1 AS Rnn, Table1.field1, Table1.field2
FROM Table1;
เป็นการ สร้างลำดับที่ครับ คือสร้างลำดับที่ ให้แต่ละเรคคอร์ดในกลุ่มเดียวกันครับ
9 @R08651
ต่อนี้เอาไปแปลงเป็นตัวนี้ครับ
แต่ว่า มันขึ้นข้อความนี้นะครับ
"Invalid bracketing of name'SELECT (select count([truck no'. "
ผมควรจะแก้ไขยังไงดีล่ะครับ
SELECT Q.EMPLOYEES
FROM [SELECT (select count(EMPLOYEES) from EmployeesRemark_Query as AA where AA.EMPLOYEES = EmployeesRemark_Query.EMPLOYEES and AA.ID < EmployeesRemark_Query.ID)+1 AS Rnn,EmployeesRemark_Query.EMPLOYEES,EmployeesRemark_Query.Remark
From EmployeesRemark_Query]. AS Q
GROUP BY Q.EMPLOYEES
ต่อนี้เอาไปแปลงเป็นตัวนี้ครับ
SELECT Q.Truck_No
FROM [SELECT (select count([Truck no]) from DueDate_all as AA where AA.[Truck no] = DueDate_All.[Truck no]) AS Rnn, DueDate_All.[Truck no] AS Truck_no, DueDate_All.[Due Date] AS DueDate
FROM DueDate_All]. AS Q
GROUP BY Q.Truck_No
แต่ว่า มันขึ้นข้อความนี้นะครับ
"Invalid bracketing of name'SELECT (select count([truck no'. "
ผมควรจะแก้ไขยังไงดีล่ะครับ
10 @R08654
FROM [SELECT (select count
เครื่องหมาย [ นี้น่าจะเปลี่ยนเป็น ( และก็ควรจะปิดท้าย DueDate_All.[Due Date] AS DueDate ด้วยเครื่องหมาย ) นะครับ
เครื่องหมาย [ นี้น่าจะเปลี่ยนเป็น ( และก็ควรจะปิดท้าย DueDate_All.[Due Date] AS DueDate ด้วยเครื่องหมาย ) นะครับ
Time: 0.3310s