 |
|
สอบถาม sql หน่อยคับเวลาดึงข้อมูลมา 2 ตารางแล้วมันมีข้อมูลซ้ำจะให้แสดงอันเดียว |
|
 |
|
|
 |
 |
|
ใช้ Distinct ไม่ได้ครับ เพราะว่า ข้อมูล Qty Cost กับ Amount ไม่ซ้ำกันครับ ต้อง Sum ข้อมูลพวกนี้ออกมาก่อน แล้วใช้ Group by เอาครับ
|
ประวัติการแก้ไข 2015-02-09 10:48:23 2015-02-09 11:26:04
 |
 |
 |
 |
Date :
2015-02-09 10:37:49 |
By :
thaidevelopment.net |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมลองละ ถ้ามี inner join มันจะไม่ได้ใช่ไหมคับ
|
 |
 |
 |
 |
Date :
2015-02-09 14:21:04 |
By :
TheCom |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ไม่เกี่ยวกับ Inner Join ครับ ลองดูสีแดงครับ ข้อมูลมันแตกต่างกัน มันเลยใช้ Distinct ไม่ได้ครับ

|
ประวัติการแก้ไข 2015-02-09 14:40:55
 |
 |
 |
 |
Date :
2015-02-09 14:40:36 |
By :
Thaidevelopment.NET |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมลองลบ Qty cost Amount ละก็ Price ออกมันได้
แต่ผมต้องการข้อมูล 4 ตัวนี้ด้วย
Qty cost Amount ละก็ Price
ต้องทำไงคับ
|
 |
 |
 |
 |
Date :
2015-02-09 16:12:36 |
By :
TheCom |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถ้าให้ออกมา Row เดียวแล้วไม่ซ้ำทำไม่ได้ครับ แต่ถ้าให้มันออกมา Row เดียวได้ จะต้องใช้ SUM ครับ
|
ประวัติการแก้ไข 2015-02-09 16:15:42
 |
 |
 |
 |
Date :
2015-02-09 16:15:00 |
By :
Thaidevelopment.NET |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
พอมี ตย.ไหมคับ
ข้อมูลจิงๆ ที่ไม่ซำ้กับจะมี 4 บรรทัด
|
ประวัติการแก้ไข 2015-02-09 16:21:23
 |
 |
 |
 |
Date :
2015-02-09 16:20:26 |
By :
TheCom |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองดูตามรูปด้านล่างครับ

มันจะนำข้อมูลที่ไม่ซ้ำกันมารวมกันก่อนโดยใช้ SUM ครับ
|
ประวัติการแก้ไข 2015-02-09 16:55:01
 |
 |
 |
 |
Date :
2015-02-09 16:54:02 |
By :
Thaidevelopment.NET |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แต่เวลาเราออก Report ข้อมูลมันจะแยกให้เหมือนเดิมไหมคับ
|
 |
 |
 |
 |
Date :
2015-02-09 17:18:20 |
By :
TheCom |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ต้องถามก่อนว่า 4 รายการนั้นจะให้โชว์ รายการไหน ครับ
รายการน้อยสุดหรือมากสุด min( fld ) หรือ max( fld )
ตัวอย่างนี้เป็นการเลือกมา 1 รายการ ที่มากที่สุด
group_name คือ ชื่อฟีลด์ที่ใช้กำหนด group
fld คือชื่อฟีลด์ที่ใช้เลือก
Code (SQL)
select tb.* from (
select group_name, max(fld) mx_fld
from tablename
group by group_name
) as tmp
left join tablename as tb
on tmp.mx_fld = tb.fld and tmp.group_name=tb.group_name
|
ประวัติการแก้ไข 2015-02-09 17:40:21
 |
 |
 |
 |
Date :
2015-02-09 17:39:06 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
มีวิธีไหนอีกไหมคับ คือผมต้องดึงข้อมูลแล้วเอาไปออกที่ Report อีกที ข้อมูลมันซ้ำกันอะ
ปิดข้อมูลซ้ำที่ report ก็ปิดแล้ว
ใครมีวิธีไหนแนะนำบ้างคับ
|
 |
 |
 |
 |
Date :
2015-02-10 17:08:32 |
By :
TheCom |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
และอะไรเป็นเกณฑ์วัดว่าเป็นข้อมูลจริงครับ
|
 |
 |
 |
 |
Date :
2015-02-10 19:47:54 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
"ใครมีวิธีไหนแนะนำบ้างคับ"
---- 1. ทำความเข้าใจกับ SQL Query Language (ใส่ใจและหมั่นฝึกฝน)
------- ทำเรื่องง่ายฯให้เป็นเรื่องยากและทำเรื่องยากฯให้เป็นเรื่องง่ายฯ อย่างคล่องแคล่ว
แต่ถ้าข้อที่ 1. คุณไม่สะดวก ก็นี่เลย "หนามยอกเอาหนามบ่ง" จาก #NO3
ถ้าคุณใช้ DataTable และต้องการเอาแถวที่ซ้ำกันออก
Code (VB.NET)
Dim tmpDT_Report = yourDataTable.DefaultView.ToTable(True, {"DocNO", "Price", "JobNO", "ตามที่ต้องการ"})
'เอาไปออกรายงานได้เลย
ปล. True == Distincnt
|
 |
 |
 |
 |
Date :
2015-02-11 06:56:43 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 13 เขียนโดย : หน้าฮี เมื่อวันที่ 2015-02-11 06:56:43
รายละเอียดของการตอบ ::
เอาใส่ตรงไหนเหรอคับ ไม่รู้จิงๆ ใส่ไม่ถูกจุด
Code (VB.NET)
sql = "SELECT dbo.BCStkIssueSub.DocNo, "
sql &= " dbo.BCStkIssueSub.Price, dbo.BCStkIssueSub.JobNo, "
sql &= " dbo.BCFinishGoodsSub.ItemCode, dbo.BCFinishGoodsSub.ItemName, "
sql &= " dbo.BCFinishGoodsSub.WHCode, dbo.BCFinishGoodsSub.Qty, dbo.BCFinishGoodsSub.Cost, dbo.BCFinishGoodsSub.Amount, "
sql &= " dbo.BCFinishGoodsSub.JobNo, dbo.BCFinishGoodsSub.unitname, dbo.BCFinishGoodsSub.sum_qfeet, "
sql &= " dbo.BCFinishGoodsSub.sum_Amount, dbo.BCStkIssue.JobNo"
sql &= " FROM dbo.BCStkIssueSub INNER JOIN"
sql &= " dbo.BCStkIssue ON dbo.BCStkIssueSub.DocNo = dbo.BCStkIssue.DocNo INNER JOIN"
sql &= " dbo.BCFinishGoodsSub ON dbo.BCStkIssueSub.DocNo = dbo.BCFinishGoodsSub.DocNo AND dbo.BCStkIssueSub.JobNo = dbo.BCFinishGoodsSub.JobNo"
sql &= " where BCStkIssueSub.DocNo = '" & CboDocno.Text & "'"
da = New SqlDataAdapter(sql, cn)
dt4 = New DataTable
da.Fill(dt4)
Dim frmr1 As New FrmViewReport
Dim rp3 As New CrystalReport8
rp3.Database.Tables(0).SetDataSource(dt4)
':::::::::::::เปิด Report โดยไม่ถามรหัสผ่าน:::::::::::::::::::::
Dim strDataReport As String = ""
Dim crtable As CrystalDecisions.CrystalReports.Engine.Table
Dim crTableLogonInto As CrystalDecisions.Shared.TableLogOnInfo
Dim cnConnInto As New CrystalDecisions.Shared.ConnectionInfo
With cnConnInto
cnConnInto.ServerName = "server2005"
cnConnInto.DatabaseName = Database_csw.Trim
cnConnInto.UserID = "sa"
cnConnInto.Password = "1234"
End With
For Each crtable In rp3.Database.Tables
crTableLogonInto = crtable.LogOnInfo
crTableLogonInto.ConnectionInfo = cnConnInto
crtable.ApplyLogOnInfo(crTableLogonInto)
Next
frmr1.objrp = rp3
frmr1.Show()
|
ประวัติการแก้ไข 2015-02-11 17:43:16
 |
 |
 |
 |
Date :
2015-02-11 17:27:24 |
By :
TheCom |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ดูเหมือนประเด็นไม่ได้เกี่ยวกะ SQL เลยนะครับเนี๊ยะ
มันเป็นเรื่องข้อมูลล้วนๆ
วิธีง่ายๆที่จะบอกได้คือ ลองใช้ข้อมูลอื่นที่ไม่ใช่
AB01-5802-0015 ดูครับ
ขืนยังเอาข้อมูลนี้มาอีก น่าจะอีกนานครับถึงจะแก้ได้
เพราะผมดูยังไงข้อมูลโดยรวมก็ไม่เหมือนกันอยู่ดี
วิธีบ้านๆคือ แยกประเด็นออกเป็น 2 แบบ คือ
1. เกิดจาก SQL
2. เกิดจากข้อมูล
จะได้แก้ปัญหาให้ตรงจุดครับ
|
 |
 |
 |
 |
Date :
2015-02-11 18:09:41 |
By :
lamaka.tor |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เอาใส่ตรงไหนเหรอคับ ไม่รู้จิงๆ ใส่ไม่ถูกจุด
จาก #NO 14 บรรทัดที่ 17 ใส่แบบนี้ครับ
Code (VB.NET)
'***** ดูจากข้อมูลใช้แค่ Field ItemCode ก็น่าจะพอ
rp3.Database.Tables(0).SetDataSource(dt4.DefaultView.ToTable(True, {"ItemCode"}))
ข้อสังเกตุ *****
คำสั่ง SQL Query และข้อมูลที่คุณนำมาแสดง อนุมานได้ว่า
คุณพยายามจะ Group By ด้วยคอลัมภ์เดียว แต่คุณเลือกมาหลายฯคอลัมน์ (มากกว่า Group By)
ยกตัวอย่างเช่น
Code (SQL)
Select Field1, Field2, Field3 From TableXXX Group By Field1
/* มันไม่ถูกต้อง*/
|
 |
 |
 |
 |
Date :
2015-02-11 20:19:42 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ย้อนกลับไปที่ #NO 13 ข้อที่ 1.
เพื่อหาสาเหตุว่า ข้อมูลมันซ้ำกันได้อย่างไร (มีมากกว่าเดิม)
สรุปให้ก็ได้ว่า มันเกิดจากการ JOIN (Inner Join / Left Join / Right Join / Other Join) โดย Many To Many
ตัวอย่างประกอบความเข้าใจจาก http://sqlity.net/en/1163/a-join-a-day-the-inner-join/
Code (SQL)
USE tempdb
GO
CREATE TABLE dbo.TblA(TblA_Val INT, TblA_Desc VARCHAR(MAX));
CREATE TABLE dbo.TblB(TblB_Val INT, TblB_Desc VARCHAR(MAX));
INSERT INTO dbo.TblA(TblA_Val, TblA_Desc)
VALUES (1,'A-1'),
(2,'A-2'),
(3,'A-3 (1st)'),
(3,'A-3 (2nd)'),
(4,'A-4 (1st)'),
(4,'A-4 (2nd)'),
(5,'A-5');
INSERT INTO dbo.TblB(TblB_Val, TblB_Desc)
VALUES (2,'B-2'),
(3,'B-3'),
(4,'B-4 (1st)'),
(4,'B-4 (2nd)'),
(5,'B-5 (1st)'),
(5,'B-5 (2nd)'),
(6,'B-6');
SELECT *
FROM dbo.TblA AS A
INNER JOIN dbo.TblB AS B
ON A.TblA_Val = B.TblB_Val;
DROP TABLE dbo.TblA
DROP TABLE dbo.TblB
ผลลัพธ์ที่ได้ 9 ระเบียน (Row) จะเห็นว่ามันมีมากกว่าเดิม
วิธีแก้ไข JOIN Many To Many โดยใช้คำสั่ง CROSS APPLY
Code (SQL)
USE tempdb
GO
CREATE TABLE dbo.TblA(TblA_Val INT, TblA_Desc VARCHAR(MAX));
CREATE TABLE dbo.TblB(TblB_Val INT, TblB_Desc VARCHAR(MAX));
INSERT INTO dbo.TblA(TblA_Val, TblA_Desc)
VALUES (1,'A-1'),
(2,'A-2'),
(3,'A-3 (1st)'),
(3,'A-3 (2nd)'),
(4,'A-4 (1st)'),
(4,'A-4 (2nd)'),
(5,'A-5');
INSERT INTO dbo.TblB(TblB_Val, TblB_Desc)
VALUES (2,'B-2'),
(3,'B-3'),
(4,'B-4 (1st)'),
(4,'B-4 (2nd)'),
(5,'B-5 (1st)'),
(5,'B-5 (2nd)'),
(6,'B-6');
SELECT * FROM dbo.tblA A CROSS APPLY (SELECT TOP 1 * FROM TblB WHERE TblB.Tblb_Val= A.TblA_Val ORDER BY 2 DESC) B
DROP TABLE dbo.TblA
DROP TABLE dbo.TblB
ลองทำความเข้าใจดูครับ (รู้ที่มาและรู้ที่ไปเสมอ)
นักปราชญ์ผูกพันกันด้วยคุณธรรม เหตุดังนี้จึงอ่อนโยนคล้ายสายวารี
สามัญชนผูกพันกันด้วยผลประโยชน์ เหตุดังนี้จึงมากมายคล้ายเมรัย
|
 |
 |
 |
 |
Date :
2015-02-12 05:54:28 |
By :
หน้าฮี |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 19 เขียนโดย : Chaidhanan เมื่อวันที่ 2015-02-12 08:38:40
รายละเอียดของการตอบ ::
ข้อมูลจาก 2 ตารางที่ต้องการคับ
output ที่ต้องการ ให้ 2 ตารางนี้รวมกันแล้วออกมา 4 บรรทัดเหมือนเดิมคับ
code ชุดนี้ที่ใช้ดึงข้อมูลแล้วเอาไปออกรายงาน
Code (VB.NET)
sql = "SELECT dbo.BCStkIssueSub.DocNo, "
sql &= " dbo.BCStkIssueSub.Price, dbo.BCStkIssueSub.JobNo, "
sql &= " dbo.BCFinishGoodsSub.ItemCode, dbo.BCFinishGoodsSub.ItemName, "
sql &= " dbo.BCFinishGoodsSub.WHCode, dbo.BCFinishGoodsSub.Qty, dbo.BCFinishGoodsSub.Cost, dbo.BCFinishGoodsSub.Amount, "
sql &= " dbo.BCFinishGoodsSub.JobNo, dbo.BCFinishGoodsSub.unitname, dbo.BCFinishGoodsSub.sum_qfeet, "
sql &= " dbo.BCFinishGoodsSub.sum_Amount, dbo.BCStkIssue.JobNo"
sql &= " FROM dbo.BCStkIssueSub INNER JOIN"
sql &= " dbo.BCStkIssue ON dbo.BCStkIssueSub.DocNo = dbo.BCStkIssue.DocNo INNER JOIN"
sql &= " dbo.BCFinishGoodsSub ON dbo.BCStkIssueSub.DocNo = dbo.BCFinishGoodsSub.DocNo AND dbo.BCStkIssueSub.JobNo = dbo.BCFinishGoodsSub.JobNo"
sql &= " where BCStkIssueSub.DocNo = '" & CboDocno.Text & "'"
ดึงได้ปกติ แต่มันจะมีปัญหาตรงที่ ว่าทำไมผมถึงเอา AB01-5802-0015 มาให้ดู
ถ้าตารางแรกมี Jobno 01 01 01 ซึ้ำกัน เวลาใช้ Code ชุดนี้ มันจะ ดึงออกมาเยอะมาก
แต่ถ้า Jobno ตารางแรก เป็น 01 02 03 ไม่มีปัญหาเพราะไม่ซ้ำกัน
ตารางที่ 2 จะซ้ำกันหรือไม่ซ้ำก็ไม่มีปัญหา
|
ประวัติการแก้ไข 2015-02-12 10:14:14 2015-02-12 10:20:00 2015-02-12 10:41:19
 |
 |
 |
 |
Date :
2015-02-12 10:13:21 |
By :
TheCom |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|