สอบถาม 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
Load balance : Server 05