 |
|
เป็นคำถามเกี่ยวกับการใช้คำสั่ง sql ครับ ช่วยเข้ามาแนะนำหน่อยครับ |
|
 |
|
|
 |
 |
|
ก่อนอื่นต้องบอกว่าไม่ใช่การบ้านนะครับ แ่เป็นงานที่ทำอยู่ เรื่องมีอยู่ว่า ในดาต้าเบสมีการเก็บข้อมูลดังนี้
user_id type code_id remark
001 06 01
001 06 02 คอมพิวเตอร์
001 07 01
001 07 02 ฟังเพลง
แต่ผมต้องการให้ข้อมูลเรียงออกมาเป็นแนวนอน เช่น
Code (SQL)
SELECT TOP 100 USER_ID ,
SUM(CASE WHEN type_code = '06' and sub_type_code = '01' THEN 1 ELSE 0 END) AS F6_1,
SUM(CASE WHEN type_code = '06' and sub_type_code = '02' THEN 2 ELSE 0 END) AS F6_2,
SUM(CASE WHEN type_code = '07' and sub_type_code = '01' THEN 1 ELSE 0 END) AS F7_1,
SUM(CASE WHEN type_code = '07' and sub_type_code = '02' THEN 2 ELSE 0 END) AS F7_2
FROM USER_SUB_DTL
WHERE USER_ID = 12
GROUP BY user_id
F6_1 F6_2 F7_1 F72
01 02 01 02
ซึ่งตอนนี้ผมใช้ sql ตามด้านบนก็ใช้ได้แล้ว แต่ติดปัญหาตรงที่จะนำฟิลด์ remark มาแสดงด้วยแต่ทำไม่ได้
Code (SQL)
SELECT TOP 100 USER_ID ,
SUM(CASE WHEN type_code = '06' and sub_type_code = '01' THEN 1 ELSE 0 END) AS F6_1,
SUM(CASE WHEN type_code = '06' and sub_type_code = '02' THEN 2 ELSE 0 END) AS F6_2,
CASE WHEN type_code = '06' and sub_type_code = '02' THEN remark ELSE 0 END AS F6_2_name,
SUM(CASE WHEN type_code = '07' and sub_type_code = '01' THEN 1 ELSE 0 END) AS F7_1,
SUM(CASE WHEN type_code = '07' and sub_type_code = '02' THEN 2 ELSE 0 END) AS F7_2
FROM USER_SUB_DTL
WHERE USER_ID = 12
GROUP BY user_id , CASE WHEN type_code = '06' and sub_type_code = '02' THEN 2 ELSE 0 END AS F6_2_name
ถ้าผมใช้แบบด้านบนมันจะแสดงออกมาเป็นสองแถวข้อมูลครับ ผมเลยอยากให้ช่วยแนะนำด้วยครับ
Tag : .NET, Ms SQL Server 2008, Win (Windows App)
|
|
 |
 |
 |
 |
Date :
2013-01-07 10:24:01 |
By :
babyprogrammer |
View :
1939 |
Reply :
4 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ข้อมูลกับโค้ดที่ให้คนละตัวกันเลย
ไม่เข้าใจว่าทำไมต้อง sum ทั้งๆ ที่เอา sub_type_code มาโชว์
ส่วน data ที่ให้ field ก็ชื่อนึง แต่ตอน command ใช้อีกชื่อ
ลองใช้ linq ทำเล่นๆ ใช่แบบที่ต้องการไหม

Code (C#)
string[][] dataArray = new string[][]
{
new string[] { "001", "06", "01", string.Empty },
new string[] { "001", "06", "02", "คอมพิวเตอร์" },
new string[] { "001", "07", "01", string.Empty },
new string[] { "001", "07", "02", "ฟังเพลง" }
};
DataTable dtData = new DataTable();
dtData.Columns.Add(new DataColumn("user_id", typeof(string)));
dtData.Columns.Add(new DataColumn("type_code", typeof(string)));
dtData.Columns.Add(new DataColumn("sub_type_code", typeof(string)));
dtData.Columns.Add(new DataColumn("remark", typeof(string)));
foreach (string[] data in dataArray)
{
DataRow drNew = dtData.NewRow();
drNew["user_id"] = data[0];
drNew["type_code"] = data[1];
drNew["sub_type_code"] = data[2];
drNew["remark"] = data[3];
dtData.Rows.Add(drNew);
}
var myData = from u in dtData.AsEnumerable()
group u by u.Field<string>("user_id") into gp
select new
{
F6_1 = gp.Where(x => x.Field<string>("type_code") == "06" && x.Field<string>("sub_type_code") == "01").Select(x => x.Field<string>("sub_type_code")).First(),
F6_2 = gp.Where(x => x.Field<string>("type_code") == "06" && x.Field<string>("sub_type_code") == "02").Select(x => x.Field<string>("sub_type_code")).First(),
F6_2_name = gp.Where(x => x.Field<string>("type_code") == "06" && x.Field<string>("sub_type_code") == "02").Select(x => x.Field<string>("remark")).First(),
F7_1 = gp.Where(x => x.Field<string>("type_code") == "07" && x.Field<string>("sub_type_code") == "01").Select(x => x.Field<string>("sub_type_code")).First(),
F7_2 = gp.Where(x => x.Field<string>("type_code") == "07" && x.Field<string>("sub_type_code") == "02").Select(x => x.Field<string>("sub_type_code")).First()
};
GridView1.DataSource = dtData;
GridView1.DataBind();
GridView2.DataSource = myData.ToList();
GridView2.DataBind();
|
 |
 |
 |
 |
Date :
2013-01-07 14:19:40 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองแบบนี้ดูครับ ไม่รู้จะใช่หรือเปล่านะครับ
Code (SQL)
WITH USER_SUM AS
(
SELECT TOP 100 USER_ID ,
SUM(CASE WHEN [type_code] = '06' and [sub_type_code] = '01' THEN 1 ELSE 0 END) AS F6_1,
SUM(CASE WHEN [type_code] = '06' and [sub_type_code] = '02' THEN 2 ELSE 0 END) AS F6_2,
SUM(CASE WHEN [type_code] = '07' and [sub_type_code] = '01' THEN 1 ELSE 0 END) AS F7_1,
SUM(CASE WHEN [type_code] = '07' and [sub_type_code] = '02' THEN 2 ELSE 0 END) AS F7_2,
(SELECT [remark] + ',' FROM USER_SUB_DTL u2 WHERE u2.user_id = u1.user_id AND u2.remark <> '' FOR XML PATH('')) AS Remark
FROM USER_SUB_DTL u1
GROUP BY USER_ID
)
SELECT USER_ID, F6_1, F6_2, F7_1, F7_2, SUBSTRING(Remark, 0, LEN(Remark)) AS Remark FROM USER_SUM

|
ประวัติการแก้ไข 2013-01-07 15:18:41
 |
 |
 |
 |
Date :
2013-01-07 14:44:40 |
By :
kenessar |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณครับ Kenessar ใช้งานได้เลยครับ 
|
 |
 |
 |
 |
Date :
2013-01-08 08:48:00 |
By :
babyprogrammer |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมมีปัญหาคล้ายแบบนี้เลยครับ อยากรู้วิธีบ้างครับ
การทำแบบนี้ต้องสร้างฟิลด์ขึ้นมาใหม่ใช่ไหมครับ
ของผมเป็นแบบนี้ครับ

ซึ่งแถวสถานะ มีหลายสถานะ ข้อมูลเลยออกมาหลายแถว
ซึ่งผมไม่รู้ต้อง Join grop by หรือใช้คำสั่งอะไรช่วย
ผมอยากได้แบบข้างบน เอาสถานะมาเรียงเป็นแถวเดียว ช่วยสอนหน่อยครับ
เช่น 5501 การพัฒนาฐานข้อมูลLINQ 2555 เบิกจ่ายงวดที่1,เบิกจ่ายงวดที่2,เบิกจ่ายงวดที่3, ประมาณนี้
Code (C#)
var rhh = from rh in IResearch
join c in ICheckStatus on rh.ID_Research equals c.ID_Research into JoinedEmpDept1
from c in JoinedEmpDept1.DefaultIfEmpty()
join s in IStatusTasks on c.ID_StatusTask equals s.ID_StatusTask into JoinedEmpDept
from s in JoinedEmpDept.DefaultIfEmpty()
select new
{
ResearchNo = rh.ResearchNo, //รหัสโครงการ
ResearchN = rh.ResearchN, //ชื่องานวิจัย
Yearbudget = rh.Yearbudget, //ปี
StastusTask = s.StatusTask1, //สถานะ
};
GridView3.DataSource = rhh.ToList();
GridView3.DataBind();
โค้ดเทสใน SQL
Code (SQL)
SELECT Research.*, CheckStatus.*,StatusTask.StatusTask
FROM [Irdbase].[dbo].[Research]
LEFT OUTER JOIN [Irdbase].[dbo].[CheckStatus] ON Research.ID_Research = CheckStatus.ID_Research
LEFT OUTER JOIN [Irdbase].[dbo].[StatusTask] ON CheckStatus.ID_StatusTask = StatusTask.ID_StatusTask
|
 |
 |
 |
 |
Date :
2013-01-08 21:33:14 |
By :
ERO-TIC |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|