SQL Serverข้อมูลที่ join กัน มีค่าซ้ำกัน รบกวนช่วยดู Code ทีจ้า
ทำใน SQL Server ค่ะ ต้องการให้ข้อมูลที่เราเลือก ในช่วงเวลานั้นๆออกมาแสดงผล ตามต้องการ ซึ่งที่เขียนมา เวลาออกมาถูกแล้ว
แต่ฟิลด์อื่นๆที่ต้องแสดงพร้อมกับเวลา เกิดมีค่าซ้ำกัน
ต้องแก้ตรงไหนอะค่ะ ติดอยู่หลายวันนานมากกกก รบกวนช่วยดู Code ให้ทีนะคะ T_T
Code (ASP)
SELECT DISTINCT tm.mDatetime as ‘เวลา’,tm.tMoney as ‘เงิน’,tl.usrID as ‘รหัส’,tid.nameID as ‘ชื่อ’
From tableMoney tm inner join tableLogin tl on CONVERT(nvarchar(10),tm.mDatetime,126)=CONVERT(nvarchar(10),tl.startTime,126)
inner join tableID tid on tid.caUser_ID=tl.usrID
WHERE CONVERT(nvarchar(10),tl.startTime,126)='2012-01-19'
AND CONVERT(nvarchar(10),tm.mDatetime,126)='2012-01-19'
AND CONVERT(nvarchar(10),tm.mDatetime,114) >= Convert(nvarchar(10),tl.startTime,114)
AND CONVERT(nvarchar(10),tm.mDatetime,114) <= Convert(nvarchar(10),tl.endTime,114)
AND CONVERT(datetime,(CONVERT(nvarchar(10),tm.mDatetime,114)),114) BETWEEN '06:30:00' and '12:30:00'
ข้อมูลตารางที่ใช้ มี 3 ตาราง คือ
tableMoney
tMoney | mDatetime(datetime)
100.00 | 2012-01-19 07:05:43.546
200.00 | 2012-01-19 08:32:53.138
60.00 | 2012-01-19 09:55:21.751
40.00 | 2012-01-19 10:49:59.947
50.00 | 2012-01-19 11:19:61.847
tableLogin
usrID | startTime(datetime) | endTime(datetime)
00001 | 2012-01-19 07:00:12.329 | 2012-01-19 09:59:55.284
00002 | 2012-01-19 10:05:12.376 | 2012-01-19 12:45:26.142
tableID
usrID | nameID
00001 | Test01
00002 | Test02
ที่ query ข้อมูลออกมาได้ตอนนี้ คือ
เวลา | เงิน | รหัส | ชื่อ
2012-01-19 07:05:43.546 | 100.00 | 00001 | Test01
2012-01-19 07:05:43.546 | 100.00 | 00002 | Test02
2012-01-19 08:32:53.138 | 200.00 | 00001 | Test01
2012-01-19 09:55:21.751 | 60.00 | 00001 | Test01
2012-01-19 09:55:21.751 | 60.00 | 00002 | Test02
2012-01-19 10:49:59.947 | 40.00 | 00001 | Test01
2012-01-19 10:49:59.947 | 40.00 | 00002 | Test02
2012-01-19 11:19:61.847 | 50.00 | 00002 | Test02
ผลลัพธ์ที่อยากได้จริงๆคือ
เวลา | เงิน | รหัส | ชื่อ
2012-01-19 07:05:43.546 | 100.00 | 00001 | Test01
2012-01-19 08:32:53.138 | 200.00 | 00001 | Test01
2012-01-19 09:55:21.751 | 60.00 | 00001 | Test01
2012-01-19 10:49:59.947 | 40.00 | 00002 | Test02
2012-01-19 11:19:61.847 | 50.00 | 00002 | Test02
และอยากให้เวลา แสดงได้แค่ 2012-01-19 07:05:43 พอ ต้องเขียนยังไงค่ะ ได้แต่แบบ 07:05:43 อย่างเดียว
รบกวนผู้รู้ช่วยดูให้ทีนะค่ะ ขอบคุณล่วงหน้ามากๆๆค่ะTag : .NET, Ms SQL Server 2005, Ms SQL Server 2008, Ms SQL Server 2012, Web (ASP.NET), VS 2010 (.NET 4.x)
Date :
2012-07-27 09:27:55
By :
porn_toon
View :
1523
Reply :
8
tableMoney ควรจะ column usrID ด้วยมิใช่หรือ
Date :
2012-07-27 09:41:39
By :
watcharop
ไม่มี usrID ในตาราง Money ให้อ่าคะ
เลยต้องใช้วิธี join กัน งงไปหมดเลย T_T
ประวัติการแก้ไข 2012-07-27 10:11:23
Date :
2012-07-27 10:10:51
By :
porn_toon
งงตรง nverchar(10)
ใช้เงื่อนไขเป็น datetime ทำไมไม่ convert เป็น datetime หรือ smalldatetime ล่ะ
ใช้ string มันได้ไม่ได้ความหมายเหมือน datetime หรอก
Date :
2012-07-27 10:31:02
By :
อิอิ
ลองแปลงเป็น datetime หรือ smalldatetime แล้ว ข้อมูลออกมาไม่ครบตามเงื่อนไขในระยะเวลานั้นๆอะคะ
Date :
2012-07-27 10:58:19
By :
porn_toon
สามารถเป็น query ให้ออกมาเหมือนที่ จขกท ต้องการนะ
แต่ว่าถ้าจะใช้งานจริงๆ การเก็บข้อมูลเช่นนี้ไม่พอดีจะทำงานหรอก
เช่นในกรณี user1 กับ user2 เข้ามาใช้งานในเวลาใกล้ๆ กัน
เราจะรู้ได้ไงว่า user ไหน เป็นผู้ทำ tablemoney เรคคอร์ดนั้น
แต่ก็ยังยืนยันว่า datetime ดีกว่า string นะ
Date :
2012-07-27 11:29:10
By :
อิอิ
งั้น รบกวน ช่วยแก้ไข Code ให้หน่อยได้ไหมค่ะ งงมากก รบกวนด้วยย
Date :
2012-07-27 12:07:29
By :
porn_toon
รบกวนคนใจดีแปลงจาก linq เป็น sql command ทีครับ
Code (C#)
private void buttonRun_Click(object sender, EventArgs e)
{
DataTable DtMoney = GetTableMoney();
DataTable DtLogin = GetTableLogin();
DataTable DtId = GetTableID();
var data = from m in DtMoney.AsEnumerable()
select new
{
mDatetime = m.Field<DateTime>("mDatetime"),
tMoney = m.Field<double>("tMoney"),
usrID = (from l in DtLogin.AsEnumerable()
where l.Field<DateTime>("startTime") <= m.Field<DateTime>("mDatetime") && l.Field<DateTime>("endTime") >= m.Field<DateTime>("mDatetime")
select l.Field<string>("usrID")).First(),
nameID = (from l in DtLogin.AsEnumerable()
join i in DtId.AsEnumerable() on l.Field<string>("usrID") equals i.Field<string>("usrID")
where l.Field<DateTime>("startTime") <= m.Field<DateTime>("mDatetime") && l.Field<DateTime>("endTime") >= m.Field<DateTime>("mDatetime")
select i.Field<string>("nameID")).First()
};
dataGridView1.DataSource = data.ToList();
}
private DataTable GetTableMoney()
{
string[][] data = new string[][]
{
new string[] { "100.00", "2012-01-19 07:05:43.546" },
new string[] { "200.00", "2012-01-19 08:32:53.138" },
new string[] { "60.00", "2012-01-19 09:55:21.751" },
new string[] { "40.00", "2012-01-19 10:49:59.947" },
new string[] { "50.00", "2012-01-19 11:19:61.847" }
};
DataTable DtData = new DataTable();
DtData.Columns.Add(new DataColumn("tMoney", typeof(double)));
DtData.Columns.Add(new DataColumn("mDatetime", typeof(DateTime)));
foreach (string[] aData in data)
{
string[] _date = aData[1].Split(("- :.").ToCharArray());
DateTime date = new DateTime(Convert.ToInt32(_date[0]), Convert.ToInt32(_date[1]), Convert.ToInt32(_date[2]));
DataRow DrNew = DtData.NewRow();
DrNew["tMoney"] = Convert.ToDouble(aData[0]);
DrNew["mDatetime"] = date.AddHours(Convert.ToInt32(_date[3])).AddMinutes(Convert.ToInt32(_date[4])).AddSeconds(Convert.ToInt32(_date[5])).AddMilliseconds(Convert.ToInt32(_date[6]));
DtData.Rows.Add(DrNew);
}
return DtData;
}
private DataTable GetTableLogin()
{
string[][] data = new string[][]
{
new string[] { "00001", "2012-01-19 07:00:12.329", "2012-01-19 09:59:55.284" },
new string[] { "00002", "2012-01-19 10:05:12.376", "2012-01-19 12:45:26.142" }
};
DataTable DtData = new DataTable();
DtData.Columns.Add(new DataColumn("usrID", typeof(string)));
DtData.Columns.Add(new DataColumn("startTime", typeof(DateTime)));
DtData.Columns.Add(new DataColumn("endTime", typeof(DateTime)));
foreach (string[] aData in data)
{
string[] _dateStart = aData[1].Split(("- :.").ToCharArray());
DateTime dateStart = new DateTime(Convert.ToInt32(_dateStart[0]), Convert.ToInt32(_dateStart[1]), Convert.ToInt32(_dateStart[2]));
string[] _dateEnd = aData[2].Split(("- :.").ToCharArray());
DateTime dateEnd = new DateTime(Convert.ToInt32(_dateEnd[0]), Convert.ToInt32(_dateEnd[1]), Convert.ToInt32(_dateEnd[2]));
DataRow DrNew = DtData.NewRow();
DrNew["usrID"] = aData[0];
DrNew["startTime"] = dateStart.AddHours(Convert.ToInt32(_dateStart[3])).AddMinutes(Convert.ToInt32(_dateStart[4])).AddSeconds(Convert.ToInt32(_dateStart[5])).AddMilliseconds(Convert.ToInt32(_dateStart[6]));
DrNew["endTime"] = dateEnd.AddHours(Convert.ToInt32(_dateEnd[3])).AddMinutes(Convert.ToInt32(_dateEnd[4])).AddSeconds(Convert.ToInt32(_dateEnd[5])).AddMilliseconds(Convert.ToInt32(_dateEnd[6]));
DtData.Rows.Add(DrNew);
}
return DtData;
}
private DataTable GetTableID()
{
string[][] data = new string[][]
{
new string[] { "00001", "Test01" },
new string[] { "00002", "Test02" }
};
DataTable DtData = new DataTable();
DtData.Columns.Add(new DataColumn("usrID", typeof(string)));
DtData.Columns.Add(new DataColumn("nameID", typeof(string)));
foreach (string[] aData in data)
{
DataRow DrNew = DtData.NewRow();
DrNew["usrID"] = aData[0];
DrNew["nameID"] = aData[1];
DtData.Rows.Add(DrNew);
}
return DtData;
}
Date :
2012-07-27 15:25:48
By :
อิอิ
SELECT DISTINCT tm.mDatetime as ‘เวลา’,tm.tMoney as ‘เงิน’,tl.usrID as ‘รหัส’,tid.nameID as ‘ชื่อ’
From tableMoney tm inner join tableLogin tl on CONVERT(nvarchar(10),tm.mDatetime,126)=CONVERT(nvarchar(10),tl.startTime,126)
LEFT JOIN tableID tid on tid.caUser_ID=tl.usrID
WHERE CONVERT(nvarchar(10),tl.startTime,126)='2012-01-19'
AND CONVERT(nvarchar(10),tm.mDatetime,126)='2012-01-19'
AND CONVERT(nvarchar(10),tm.mDatetime,114) >= Convert(nvarchar(10),tl.startTime,114)
AND CONVERT(nvarchar(10),tm.mDatetime,114) <= Convert(nvarchar(10),tl.endTime,114)
AND CONVERT(datetime,(CONVERT(nvarchar(10),tm.mDatetime,114)),114) BETWEEN '06:30:00' and '12:30:00'
ลองดูนะครับ
Date :
2012-07-31 03:31:26
By :
eazycorner
Load balance : Server 04