กระทู้เก่าบอร์ด อ.Yeadram
3,386 13
URL.หัวข้อ /
URL
เปลี่ยนข้อมูลแนวนอนเป็นแนวตั้ง
<--Product--> <--------Date (1-31)------------------------>
Code Name 1| 2| 3| 4| 5|
0001 TTTT 10 20 50 100 40
0002 VVVV 50 30 90 10 20
อยากให้เป็นข้อมูลแนวนี้
Code Name Date Q'ty
0001 TTTT 1 10
0001 TTTT 2 20
0001 TTTT 3 50
0001 TTTT 4 100
0001 TTTT 5 40
0002 VVVV 1 50
0002 VVVV 2 30
0002 VVVV 3 90
0002 VVVV 4 10
0002 VVVV 5 20
สวัสดีค่ะ จากตัวอย่างรบกวนอาจารย์ด้วยคะ
ข้อมูลจริงๆมีเยอะมากค่ะ
รบกวนด้วยค่ะ
Code Name 1| 2| 3| 4| 5|
0001 TTTT 10 20 50 100 40
0002 VVVV 50 30 90 10 20
อยากให้เป็นข้อมูลแนวนี้
Code Name Date Q'ty
0001 TTTT 1 10
0001 TTTT 2 20
0001 TTTT 3 50
0001 TTTT 4 100
0001 TTTT 5 40
0002 VVVV 1 50
0002 VVVV 2 30
0002 VVVV 3 90
0002 VVVV 4 10
0002 VVVV 5 20
สวัสดีค่ะ จากตัวอย่างรบกวนอาจารย์ด้วยคะ
ข้อมูลจริงๆมีเยอะมากค่ะ
รบกวนด้วยค่ะ
13 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R10790
ใช้ Query ครับ
TRANSFORM Sum(Item.[Quantity]) AS SumOfQuantity
SELECT Item.[ItemCode], Item.[ItemName], Sum(Item.[Quantity]) AS [Total Of Quantity]
FROM Item
GROUP BY Item.[ItemCode], Item.[ItemName]
PIVOT Format([InDate],"Short Date");
สร้างได้ง่ายๆ โดยใช้ Query Wizard เลือก Crosstab Query แล้วทำตาม wizard เลยครับ
TRANSFORM Sum(Item.[Quantity]) AS SumOfQuantity
SELECT Item.[ItemCode], Item.[ItemName], Sum(Item.[Quantity]) AS [Total Of Quantity]
FROM Item
GROUP BY Item.[ItemCode], Item.[ItemName]
PIVOT Format([InDate],"Short Date");
สร้างได้ง่ายๆ โดยใช้ Query Wizard เลือก Crosstab Query แล้วทำตาม wizard เลยครับ
3 @R10791
ยังงงอยู่ครับ
ตัวอย่างที่ 1
Code Name 1| 2| 3| 4| 5|
0001 TTTT 10 20 50 100 40
0002 VVVV 50 30 90 10 20
ตัวอย่างที่ 2
Code Name Date Q'ty
0001 TTTT 1 10
0001 TTTT 2 20
0001 TTTT 3 50
0001 TTTT 4 100
0001 TTTT 5 40
0002 VVVV 1 50
0002 VVVV 2 30
0002 VVVV 3 90
0002 VVVV 4 10
0002 VVVV 5 20
คืออยากเปลี่ยนจาก ตัวอย่างที่ 1
เป็น ตัวอย่างที่ 2 ค่ะ
รบกวนด้วยนะค่ะ
ตัวอย่างที่ 1
Code Name 1| 2| 3| 4| 5|
0001 TTTT 10 20 50 100 40
0002 VVVV 50 30 90 10 20
ตัวอย่างที่ 2
Code Name Date Q'ty
0001 TTTT 1 10
0001 TTTT 2 20
0001 TTTT 3 50
0001 TTTT 4 100
0001 TTTT 5 40
0002 VVVV 1 50
0002 VVVV 2 30
0002 VVVV 3 90
0002 VVVV 4 10
0002 VVVV 5 20
คืออยากเปลี่ยนจาก ตัวอย่างที่ 1
เป็น ตัวอย่างที่ 2 ค่ะ
รบกวนด้วยนะค่ะ
4 @R10793
เอาไปปรับชื่อ และ datatype ตามจริงนะครับ
Public Sub TransposeTable()
Dim lngLoop As Long
Dim strSQL As String
DoCmd.SetWarnings False
For lngLoop = 1 To 31
strSQL = "INSERT INTO ItemNew ( ItemCode, ItemName, Quantity, InDate)" _
& " SELECT ItemOld.ItemCode, ItemOld.ItemName, ItemOld.[" & lngLoop & "], " & lngLoop _
& " FROM ItemOld"
DoCmd.RunSQL strSQL
Next lngLoop
DoCmd.SetWarnings True
End Sub
Public Sub TransposeTable()
Dim lngLoop As Long
Dim strSQL As String
DoCmd.SetWarnings False
For lngLoop = 1 To 31
strSQL = "INSERT INTO ItemNew ( ItemCode, ItemName, Quantity, InDate)" _
& " SELECT ItemOld.ItemCode, ItemOld.ItemName, ItemOld.[" & lngLoop & "], " & lngLoop _
& " FROM ItemOld"
DoCmd.RunSQL strSQL
Next lngLoop
DoCmd.SetWarnings True
End Sub
5 @R10799
สวัสดีค่ะ
ขอบพระคุณ คุณPichaiTC มากเลยค่ะ
ทำได้แล้ว เยี่ยมมากค่ะ หามานานในที่สุด
ก็เจอคนเก่ง ค่ะ ขอบคุณจริงๆค่ะ
ขอบพระคุณ คุณPichaiTC มากเลยค่ะ
ทำได้แล้ว เยี่ยมมากค่ะ หามานานในที่สุด
ก็เจอคนเก่ง ค่ะ ขอบคุณจริงๆค่ะ
6 @R11135
เทพ ครับ
7 @R11203
คิดกลับ ด้าน
แล้วถ้า ข้อมูลเป็นแนวตั้ง จะทำเป็นแนวนอน ทำอย่างไรดี
(5555)
แล้วถ้า ข้อมูลเป็นแนวตั้ง จะทำเป็นแนวนอน ทำอย่างไรดี
(5555)
8 @R11204
ถ้ากลับด้าน ทำตาม R10790 ครับ
9 @R11205
เพิ่งสังเกตว่าที่ R10791 คุณ DADA ข้างบนใช้ "ครับ" ข้างล่างใช้ "ค่ะ"
สรุปว่าคุณเป็น หญิง หรือ ชาย ?
สรุปว่าคุณเป็น หญิง หรือ ชาย ?
10 @R16017
เรียน อาจารย์ PichaiTC จาก (R10793) Has field name (หัวตาราง) ถ้าเป็นตัวเลขจะนำเข้าได้ไม่มีปัญหาอะไร แต่ถ้าเป็น ตัวอักษร จะนำเข้าไม่ได้ครับ (ติดค่าพารามิเตอร์)
ถ้าตารางเป็นแบบนี้จะปรับแก้หรือประยุกต์ใช้ได้อย่างไรครับ
Code Name DxA DxB DxC DxD DxF
0001 TTTT 10 20 50 100 40
0002 VVVV 50 30 90 10 20
ถ้าตารางเป็นแบบนี้จะปรับแก้หรือประยุกต์ใช้ได้อย่างไรครับ
Code Name DxA DxB DxC DxD DxF
0001 TTTT 10 20 50 100 40
0002 VVVV 50 30 90 10 20
11 @R16018
เพิ่มเติมครับ ต้องการให้ข้อมูลออกมาเป็นแบบนี้ครับ
Code Name Dx Q'ty
0001 TTTT DxA 10
0001 TTTT DxB 20
0001 TTTT DxC 50
0001 TTTT DxD 100
0001 TTTT DxE 40
0002 VVVV DxA 50
0002 VVVV DxB 30
0002 VVVV DxC 90
0002 VVVV DxD 10
0002 VVVV DxE 20
Code Name Dx Q'ty
0001 TTTT DxA 10
0001 TTTT DxB 20
0001 TTTT DxC 50
0001 TTTT DxD 100
0001 TTTT DxE 40
0002 VVVV DxA 50
0002 VVVV DxB 30
0002 VVVV DxC 90
0002 VVVV DxD 10
0002 VVVV DxE 20
12 @R16027
ผมอ่านแล้วอาจไม่เข้าใจก็ได้ว่า ทำไมไม่ใช้ UNION ALL อ่ะครับ ในเมื่อคุณสมบัติมันสามารถกลับข้อมูลแบบนี้ได้เช่นกัน เช่น เขียนในคิวรี่ใหม่แบบนี้
SELECT Code, Name, "DxA" AS [Dx], [DxA] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxB" AS [Dx], [DxB] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxC" AS [Dx], [DxC] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxD" AS [Dx], [DxD] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxE" AS [Dx], [DxE] AS [Q'ty]
FROM Table1
ORDER BY [Code], [Dx];
ผมอาจเข้าใจโจทย์ผิดก็ได้นะครับ ถือว่าเป็นข้อเสนอทางเลือกแล้วกันครับ
SELECT Code, Name, "DxA" AS [Dx], [DxA] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxB" AS [Dx], [DxB] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxC" AS [Dx], [DxC] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxD" AS [Dx], [DxD] AS [Q'ty]
FROM Table1
UNION ALL
SELECT Code, Name, "DxE" AS [Dx], [DxE] AS [Q'ty]
FROM Table1
ORDER BY [Code], [Dx];
ผมอาจเข้าใจโจทย์ผิดก็ได้นะครับ ถือว่าเป็นข้อเสนอทางเลือกแล้วกันครับ
13 @R16062
Public Sub TransposeTable()
'Code นี้ตัดตอนการสร้างตารางปลายทางออก (ยังไม่ได้เขียนให้เพราะต้องใช้เวลามากกว่านี้)
'โดยผู้ใช้ต้องสร้างตารางปลายทางที่ถูกต้อง(รวมถึง Key, Data Type,...) ก่อน run code นี้
'ชื่อตารางต้นทาง
Const strTableName_Original As String = "Transpose2_Before"
'ชื่อตารางปลายทาง
Const strTableName_Transposed As String = "Transpose2_After"
'ตำแหน่งของ field แรกที่เก็บค่าที่จะพลิกตาราง เช่น Field ที่ 1 และ 2 เป็น Key, Field ที่ 3 เรื่อยเป็นเป็นข้อมูล ก็ให้ระบุเลข 3
Const lngStartDataField As Long = 3
Dim db As Database
Dim tbOriginal As TableDef
Dim lngLoop As Long
Dim strSQL As String
Dim lngLastFieldNo As Long
Dim strFieldName As String
DoCmd.SetWarnings False
Set db = CurrentDb
Set tbOriginal = db.TableDefs(strTableName_Original)
lngLastFieldNo = tbOriginal.Fields.Count - 1
For lngLoop = (lngStartDataField - 1) To lngLastFieldNo
strFieldName = tbOriginal.Fields(lngLoop).Name
strSQL = "INSERT INTO " & strTableName_Transposed & "(Code, Name, Dx, Quantity)" _
& " SELECT Code, Name, '" & strFieldName & "', [" & strFieldName & "]" _
& " FROM " & strTableName_Original
DoCmd.RunSQL strSQL
Next lngLoop
Set tbOriginal = Nothing
DoCmd.SetWarnings True
End Sub
Time: 0.3370s
จะต้องเขียน Code อย่างไรค่ะ