 |
|
ขอคำปรึกษาเรื่องการ Join ตาราง table หน่อยครับ ภาษา sql |
|
 |
|
|
 |
 |
|
ใน crytal report มีคำสั่ง suppress If Duplicated ครับ 
|
 |
 |
 |
 |
Date :
2013-01-07 11:04:06 |
By :
tee |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ไม่ได้ครับ ผมอาจจะสื่อสารผิด คือ ผมอยากได้รูปแบบคล้ายกระทู้นี้อ่ะครับ
https://www.thaicreate.com/dotnet/forum/088868.html
อยากได้เป็น งานวิจัยหนึ่งให้แสดงแค่หนึ่งแถว แต่เพราะมันมีหลายสถานะ มันเลยแสดงออกมาหลายแถว
ผมอยากให้มันมี , ลูกน้ำ คั่น ตรงสถานะ แล้วเก็บสถานะไว้ในฟิลด์เดียวกัน
เช่น
5501 การพัฒนาฐานข้อมูลLINQ 2555 เบิกจ่ายงวดที่1,เบิกจ่ายงวดที่2,เบิกจ่ายงวดที่3,
ประมาณนี้ ต้องทำยังไงครับ
|
 |
 |
 |
 |
Date :
2013-01-09 20:10:38 |
By :
ERO-TIC |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองทำ ตามนี้ดูครับ
นำ ตารางที่ join กัน ไว้ ไปทำเป็น views ครับ โดยใน views นี้ให้ select case ฟิวด์ status เพิ่มมาอีก1 ฟิวด์
ตัวอย่าง คำสั่ง views : Vw_Research
Code (SQL)
SELECT TOP (100) PERCENT id, name, years, status,
(CASE WHEN [status] = 'เบิกจ่ายงวดที่ 1' THEN 1 WHEN [status] = 'เบิกจ่ายงวดที่ 2' THEN 2 WHEN [status] = 'เบิกจ่ายงวดที่ 3' THEN 3 WHEN [status] = 'ส่งร่างรายงานฉบับ สมบูรณ์'
THEN 4 WHEN [status] = 'ส่งรายงานฉบับ สมบูรณ์' THEN 5 WHEN [status] = 'เสร็จแล้ว' THEN 6 ELSE 0 END) AS statusnumber
FROM dbo.Research
GROUP BY id, name, years, status
ORDER BY years DESC
รูปภาพ views

เมื่อสร้าง views เสร็จแล้ว ให้เขียนคำสั่ง sql ดังนี้ครับ
Code (SQL)
SELECT TOP (100) PERCENT id, name,
case when( sum(CASE WHEN [statusnumber] = 1 THEN 1 ELSE 0 END)) =1 then 'บิกจ่ายงวดที่ 1' else '' end AS status1,
case when( sum(CASE WHEN [statusnumber] = 2 THEN 2 ELSE 0 END)) =2 then 'บิกจ่ายงวดที่ 2' else '' end AS status2,
case when( sum(CASE WHEN [statusnumber] = 3 THEN 3 ELSE 0 END)) =3 then 'เบิกจ่ายงวดที่ 3' else '' end AS status3,
case when( sum(CASE WHEN [statusnumber] = 4 THEN 4 ELSE 0 END)) =4 then 'ส่งร่างรายงานฉบับ สมบูรณ์' else '' end AS status4,
case when( sum(CASE WHEN [statusnumber] = 5 THEN 5 ELSE 0 END)) =5 then 'ส่งรายงานฉบับ สมบูรณ์' else '' end AS status5,
case when( sum(CASE WHEN [statusnumber] = 6 THEN 6 ELSE 0 END)) =6 then 'เสร็จแล้ว' else '' end AS status6
FROM VW_Research
group by id,name,years
ORDER BY years DESC
จะได้ข้อมูลตามภาพ

|
 |
 |
 |
 |
Date :
2013-01-10 12:43:08 |
By :
tee |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณมากๆ เลยครับ ผมทำตามที่คุณแนะนำได้แล้วครับ
ผมเขียนโค้ดแบบนี้ครับ แล้วเจอปัญหาใหม่ครับพอเพิ่มฟิลด์วันที่เข้ามาด้วย
Code (SQL)
SELECT TOP 100 PERCENT [ResearchNo],[ResearchN],[Yearbudget],[CheckStatusDate],
case when( sum(CASE WHEN [ID_StatusTask] = 1 THEN 1 ELSE 0 END)) =1 then 'เบิกจ่ายงวดที่ 1' else '' end AS status1,
case when( sum(CASE WHEN [ID_StatusTask] = 2 THEN 2 ELSE 0 END)) =2 then 'เบิกจ่ายงวดที่ 2' else '' end AS status2,
case when( sum(CASE WHEN [ID_StatusTask] = 3 THEN 3 ELSE 0 END)) =3 then 'เบิกจ่ายงวดที่ 3' else '' end AS status3,
case when( sum(CASE WHEN [ID_StatusTask] = 4 THEN 4 ELSE 0 END)) =4 then 'ส่งร่างรายงานฉบับสมบูรณ์' else '' end AS status4,
case when( sum(CASE WHEN [ID_StatusTask] = 5 THEN 5 ELSE 0 END)) =5 then 'ส่งรายงานฉบับสมบูรณ์' else '' end AS status5,
case when( sum(CASE WHEN [ID_StatusTask] = 6 THEN 6 ELSE 0 END)) =6 then 'สำเร็จแล้ว' else '' end AS status6
FROM [Irdbase].[dbo].[View_1]
GROUP BY ResearchNo, ResearchN, Yearbudget, CheckStatusDate
ORDER BY Yearbudget DESC
ซึ่งพอเพิ่มฟิลด์วันที่เข้ามามันก็แสดงหลายแถวเหมือนเดิม
ซึ่งวันที่มันมีหลายวันที่ ไม่ตายตัวเหมือนสถานะ จะเช็คค่ายังไงครับ

รูปแบบที่ต้องการให้แสดงเป็นแถวเดียวเหมือนเดิมครับ
ResearchNo ResearchN Yearbudget status1 status2 status3 ... วันที่สถานะ 1 วันที่สถานะ 2 วันที่สถานะ 3
5501 การพัฒนาฐานข้อมูลLINQ 2555 เบิกจ่ายงวดที่1,เบิกจ่ายงวดที่2,เบิกจ่ายงวดที่3,... 2012-10-25 2012-11-25 2012-12-25
รบกวนช่วยแนะนำด้วยนะครับ
|
 |
 |
 |
 |
Date :
2013-01-11 21:25:24 |
By :
ERO-TIC |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถ้ายังอยากใช้ linq เหมือนเดิม
Code (C#)
var rhh = new [] {
new {ResearchNo = "5502",ResearchN="ประมวลผลตัวเลข"
,Yearbudget ="2555",StastusTask="เบิกจ่ายงวด 1"},
new {ResearchNo = "5501",ResearchN="การพัฒนา LINQ"
,Yearbudget ="2555",StastusTask="เบิกจ่ายงวด 1"},
new {ResearchNo = "5502",ResearchN="ประมวลผลตัวเลข"
,Yearbudget ="2555",StastusTask="เบิกจ่ายงวด 2"},
new {ResearchNo = "5401",ResearchN="ระบบคำนวณ"
,Yearbudget ="2554",StastusTask="เบิกจ่ายงวด 1"},
new {ResearchNo = "5501",ResearchN="การพัฒนา LINQ"
,Yearbudget ="2555",StastusTask="สำเร็จแล้ว"},
new {ResearchNo = "5401",ResearchN="ระบบคำนวณ"
,Yearbudget ="2554",StastusTask="เบิกจ่ายงวด 2"},
new {ResearchNo = "5501",ResearchN="การพัฒนา LINQ"
,Yearbudget ="2555",StastusTask="เบิกจ่ายงวด 3"}
};
var rhh2 = from rhhItem in rhh
group rhhItem by new {
rhhItem.ResearchNo,
rhhItem.ResearchN,
rhhItem.Yearbudget
} into r
select new {
ResearchNo = r.Key.ResearchNo,
ResearchN = r.Key.ResearchN,
Yearbudget = r.Key.Yearbudget,
StastusTask = ( from rItem in r select rItem.StastusTask)
.Aggregate((c,n)=> c + " , " + n)
};
GridView3.DataSource = rhh2.ToList();
/*
ทดลองเปลี่ยนเป็น rhh.ToList() แล้วลองสังเกตุความเปลี่ยนแปลง
ส่วนฟิล CheckStatusDate นี่ก็ไม่น่ายาก ลองเอาไปดัดแปลงดูครับ
*/
|
 |
 |
 |
 |
Date :
2013-01-12 21:31:54 |
By :
SandKing |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณครับ แต่แบบนี้คือประกาศค่าไว้ในอารเรย์
แต่ถ้าผมต้องการดึงมาจากฐานข้อมูลเลยล่ะครับ ผมทำไม่ได้
ต้องการถึงจากฐานข้อมูลเลยครับ เพราะงานมันมีเพิ่มมาเรื่อยๆครับ
Code (C#)
var rhh = from v in db.View_1s //ดึงมาจาก View ที่สร้างไว้
select new
{
ResearchNo = v.ResearchNo,
ResearchN = v.ResearchN,
Yearbudget = v.Yearbudget,
StastusTask = v.StatusTask
};
var rhh2 = from rhhItem in rhh
group rhhItem by new
{
rhhItem.ResearchNo,
rhhItem.ResearchN,
rhhItem.Yearbudget
} into r
select new
{
ResearchNo = r.Key.ResearchNo,
ResearchN = r.Key.ResearchN,
Yearbudget = r.Key.Yearbudget,
StastusTask = (from rItem in r select rItem.StastusTask)
.Aggregate((c, n) => c + " , " + n)
};
GridView3.DataSource = rhh2.ToList();
GridView3.DataBind();
//รันแล้วมัน error ว่า The query operator 'Aggregate' is not supported.
|
 |
 |
 |
 |
Date :
2013-01-14 08:51:55 |
By :
ERO-TIC |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
งั้นลองใช้แบบนี้ดูครับ
Code (C#)
StastusTask = string.Join(",",( from rItem in r select rItem.StastusTask ).ToArray())
ปล.ที่ต้องใช้ array เพราะผมไม่รู้ว่าดาต้าเบสของคุณก่อนการ join มันเก็บข้อมูลอะไรบ้าง เลยให้ rhh เป็น array แทน
|
 |
 |
 |
 |
Date :
2013-01-14 12:39:20 |
By :
SandKing |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมขอถามเพิ่มหน่อยนะครับ เกี่ยวกับ Dataset Datatable Linq
ตัวอย่างโค้ด Excel ที่ผมใช้อยู่
Code (C#)
protected void Button1_Click(object sender, EventArgs e)
{
string StrConn = WebConfigurationManager.ConnectionStrings["IrdbaseConnectionString"].ConnectionString;
SqlConnection Conn = new SqlConnection(StrConn);
Conn.Open();
string sqlCustommer = "SELECT ID_Researcher, PrefixName, ResearcherN, IDcard FROM Researcher";
//ผมอยากทราบว่าเราสามารถเขียนคิวรี ด้วย Linq ได้ไหมครับ แล้วยัดใส่ Datatable อีกที
SqlDataAdapter da = new SqlDataAdapter(sqlCustommer, Conn);
DataTable people = new DataTable(); // Datatable
da.Fill(people);
// Create excel file.
ExcelFile ef = new ExcelFile();
ExcelWorksheet ws = ef.Worksheets.Add("DataSheet");
ws.InsertDataTable(people, "A1", true); //people บังคับต้องใช้ Datatable
// Stream file to browser
ef.SaveToHttpResponse(this.Response, "Report." + DateTime.Now.ToString() + ".xlsx");
}
ตัวทีผมใช้มันบังคับให้ใช้ Datatable ผมเลยอยากรู้ว่ามันใช้ร่วมกันได้ไหมครับระหว่าง Datatable กับ Linq ต้องทำยังไง
หรือมีวิธีอื่นที่ออกไฟล์ Excel .xlsx ได้และรองรับภาษาไทย
|
ประวัติการแก้ไข 2013-01-16 20:23:43
 |
 |
 |
 |
Date :
2013-01-16 20:22:53 |
By :
ERO-TIC |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|