C# 在ID相同的情况下,如何将多行合并为单行,每行的数据具有不同的列
我有多个内部联接的结果。我希望将这些行合并成一行,每行中的每个数据都有额外的列C# 在ID相同的情况下,如何将多行合并为单行,每行的数据具有不同的列,c#,sql,sql-server,C#,Sql,Sql Server,我有多个内部联接的结果。我希望将这些行合并成一行,每行中的每个数据都有额外的列 Select fp.idfp, fp.idperson, p.fname+' '+p.mname+' '+p.lname as Patient, fp.date, m.idmed, n.medname+' '+n.meddosage+' '+n.medtype as MedicineName, m.quantity, m.date as [Date Dispense] from FPTRANSAC fp Inner
Select fp.idfp, fp.idperson, p.fname+' '+p.mname+' '+p.lname as Patient,
fp.date, m.idmed, n.medname+' '+n.meddosage+' '+n.medtype as MedicineName, m.quantity, m.date as [Date Dispense]
from FPTRANSAC fp
Inner Join PRECORD p
On fp.idperson = p.idperson
inner join MEDOUT m
ON fp.idfp = m.idtransac
inner join NEWMED n
on m.idmed = n.idmed
union all
Select i.idimmu, i.idperson, p.fname+' '+p.mname+' '+p.lname as Patient,
i.date, m.idmed, n.medname+' '+n.meddosage+' '+n.medtype as MedicineName, m.quantity, m.date as [Date Dispense]
from IMMUTRANSACTION i
Inner Join PRECORD p
On p.idperson = i.idperson
inner join MEDOUT m
ON i.idimmu = m.idtransac
inner join NEWMED n
on m.idmed = n.idmed
结果是:
idfptran | idperson | Patient | date | idmed | MedicineName | quantity | Date Dispense
F-1 | 00001 | Jenny Jones | datehere | 1 | Cetirizine | 5 | datehere
F-1 | 00001 | Jenny Jones | datehere | 3 | Tylenol | 8 | datehere
I-1 | 00015 | Mark Sawyer | datehere | 2 | Salbutamol | 2 | datehere
I-1 | 00015 | Mark Sawyer | datehere | 4 | Amoxicillin | 3 | datehere
I-1 | 00015 | Mark Sawyer | datehere | 7 | Carbocisteine | 3 | datehere
我想要这样的桌子,但我不知道是否可能。你能帮忙吗?我已经尝试解决这个问题好几天了:请帮忙。我正在使用mssql。对于Date Dipense,它可以获取相同ID的最后一行值或第一行值
idfptran | idperson | Patient | date | idmed | MedicineName | quantity | idmed | MedicineName | quantity | idmed | MedicineName | quantity | Date Dispense
F-1 | 00001 | Jenny Jones | datehere | 1 | Cetirizine | 5 | 3 | Tylenol | 8 | | | | datehere
I-1 | 00015 | Mark Sawyer | datehere | 2 | Salbutamol | 2 | 4 | Amoxicillin | 3 | 7 | Carbocisteine| 3 | datehere
以下是示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication108
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("idfptran", typeof(string));
dt.Columns.Add("idperson", typeof(string));
dt.Columns.Add("Patient", typeof(string));
dt.Columns.Add("date", typeof(DateTime));
dt.Columns.Add("idmed", typeof(int));
dt.Columns.Add("MedicineName", typeof(string));
dt.Columns.Add("quantity", typeof(int));
dt.Columns.Add("Date Dispense", typeof(DateTime));
dt.Rows.Add(new object[] {"F-1", "00001", "Jenny Jones", DateTime.Parse("4/8/19"), 1, "Cetirizine", 5, DateTime.Parse("4/8/19")});
dt.Rows.Add(new object[] {"F-1", "00001", "Jenny Jones", DateTime.Parse("4/8/19"), 3, "Tylenol", 8, DateTime.Parse("4/8/19")});
dt.Rows.Add(new object[] {"I-1", "00015", " Mark Sawyer", DateTime.Parse("4/8/19"), 2, "Salbutamol", 2, DateTime.Parse("4/8/19")});
dt.Rows.Add(new object[] {"I-1", "00015", " Mark Sawyer", DateTime.Parse("4/8/19"), 4, "Amoxicillin", 3, DateTime.Parse("4/8/19")});
dt.Rows.Add(new object[] {"I-1", "00015", " Mark Sawyer", DateTime.Parse("4/8/19"), 7, "Carbocisteine", 3, DateTime.Parse("4/8/19")});
var groups = dt.AsEnumerable().GroupBy(x => new { idperson = x.Field<string>("idperson"), dispense = x.Field<DateTime>("Date Dispense") }).ToList();
int maxMedicenes = groups.Select(x => x.Count()).Max(x => x);
DataTable pivot = new DataTable();
pivot.Columns.Add("idfptran", typeof(string));
pivot.Columns.Add("idperson", typeof(string));
pivot.Columns.Add("Patient", typeof(string));
pivot.Columns.Add("date", typeof(DateTime));
for (int i = 1; i <= maxMedicenes; i++)
{
pivot.Columns.Add("idmed_" + i.ToString(), typeof(int));
pivot.Columns.Add("MedicineName_" + i.ToString(), typeof(string));
pivot.Columns.Add("quantity_" + i.ToString(), typeof(int));
}
pivot.Columns.Add("Date Dispense", typeof(DateTime));
foreach (var group in groups)
{
DataRow newRow = pivot.Rows.Add();
newRow["idfptran"] = group.First().Field<string>("idfptran");
newRow["idperson"] = group.Key.idperson;
newRow["Patient"] = group.First().Field<string>("Patient");
newRow["date"] = group.First().Field<DateTime>("date");
int i = 1;
foreach (DataRow row in group)
{
newRow["idmed_" + i.ToString()] = row.Field<int>("idmed");
newRow["MedicineName_" + i.ToString()] = row.Field<string>("MedicineName");
newRow["quantity_" + i.ToString()] = row.Field<int>("quantity");
i++;
}
newRow["Date Dispense"] = group.Key.dispense;
}
}
}
}
我建议先将所有与人员相关的数据收集到一个表或查询中,然后添加其他数据,如idmed、medicine name等,而不是构建一个联盟。。。从下一层中的其他源表开始,对每个源使用外部联接。您尝试创建的表将不是第一个正常形式。这种显示方式与您试图通过规范化摆脱的一切都背道而驰。您希望它以这种方式显示有什么原因吗?@jarlh-Microsoft-sqlserver@haag1事实上,我这里有2笔交易。1.Immum事务和FPTransac。2.MEDOUT所以,在MEDOUT中,我只是调用TransactionImmumTransaction或FPTransac的id来链接患者请求的所有药物。我之所以希望表格是这样的,以便每次交易时,他们都能看到患者询问的药物。您需要的是一个透视表,其中您由一个人进行分组。我会写代码的,谢谢。我真的很感谢你的帮助。我忘了告诉你,数据不仅仅是这样,时不时会有更多的事务被添加。我还有3个表要连接,这次我只使用了2个事务表。我不明白你想告诉我什么。我很抱歉。一个仍在学习和挣扎的新手,想知道这是否可能。