表A:
------------------
InfoID FName FContext
1 name1 c1
1 name2 c2
1 name3 c3
2 name1 c4
3 name4 c5
------------------
转换成
表B:
---------------------
InfoID name1 name2 name3 name4
1 c1 c2 c3 null
2 c4 null null null
3 null null null c5
---------------------
程序组织怎么组织成表B的形式
for循环?
我的思路是先循环添加列名
然后在根据记录条数循环添加数据,本人用了3个循环,其中有2个是嵌套循环
实现之后发现新加的数据值和列名没有对上
求解决办法
------------------
InfoID FName FContext
1 name1 c1
1 name2 c2
1 name3 c3
2 name1 c4
3 name4 c5
------------------
转换成
表B:
---------------------
InfoID name1 name2 name3 name4
1 c1 c2 c3 null
2 c4 null null null
3 null null null c5
---------------------
程序组织怎么组织成表B的形式
for循环?
我的思路是先循环添加列名
然后在根据记录条数循环添加数据,本人用了3个循环,其中有2个是嵌套循环
实现之后发现新加的数据值和列名没有对上
求解决办法
create table A
(
InfoID int ,
FName varchar(20),
FContext varchar(10)
)insert into A values(1,'name1','c1');
insert into A values(1,'name2','c2');
insert into A values(1,'name3','c3');
insert into A values(2,'name1','c4');
insert into A values(3,'name4','c5');declare @sql varchar(8000)
set @sql = 'select [InfoID] '
select @sql = @sql + ' , max(case [FName] when ''' + [FName] + ''' then FContext else null end) [' + [FName] + ']'
from (select distinct [FName] from A) as a
set @sql = @sql + ' from A group by [InfoID]'
exec(@sql)
select [InfoID],
max(case [FName] when 'name1' then FContext else null end) [name1] ,
max(case [FName] when 'name2' then FContext else null end) [name2] ,
max(case [FName] when 'name3' then FContext else null end) [name3] ,
max(case [FName] when 'name4' then FContext else null end) [name4]
from A group by [InfoID];
不符合我动态添加的条件啊。。
select InfoID from A
group by InfoID
pivot FName 试试看
出来的是数量而不是这个对应的值
c#,vb。net都可以
求代码。
SqlDataApter sda=new SqlDataApter(str,con);
DataSet ds=sda.Fill()
DataTable dt=ds.Table[0];
然后for读取数据
再将数据添加到B表中
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace FormTest3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.DefaultCellStyle.NullValue = "null"; //数据为空时显示null DataTable t = GetData(); //读取数据,这里是自己拼的,LZ可以自行改成读数据库的方法 dataGridView1.DataSource = ProcedureData(t); //数据处理
} DataTable ProcedureData(DataTable dt)
{
DataTable ret = new DataTable();
ret.Columns.Add("InfoID"); foreach (DataRow row in dt.Rows)
{
int id = Convert.ToInt32(row["InfoID"]);
string fieldName = row["FName"].ToString(); if (!(ret.Columns.Contains(fieldName)))
ret.Columns.Add(fieldName); DataRow dRow = GetRow(ret, id); //查询ID对应行 //新增一行
if (dRow == null)
{
dRow = ret.NewRow();
dRow["InfoID"] = id;
ret.Rows.Add(dRow);
} dRow[fieldName] = row["FContext"];
} return (ret);
} DataTable GetData() //读取数据
{
DataTable ret = new DataTable(); ret.Columns.Add("InfoID");
ret.Columns.Add("FName");
ret.Columns.Add("FContext"); ret.Rows.Add(new object[] { 1, "name1", "c1" });
ret.Rows.Add(new object[] { 1, "name2", "c2" });
ret.Rows.Add(new object[] { 1, "name3", "c3" });
ret.Rows.Add(new object[] { 2, "name1", "c4" });
ret.Rows.Add(new object[] { 3, "name4", "c5" }); return (ret);
} DataRow GetRow(DataTable dt, int id)
{
if (dt != null && dt.Columns.Contains("InfoID"))
foreach (DataRow row in dt.Rows)
if (Convert.ToInt32(row["InfoID"]) == id)
return (row); return (null);
}
}
}