表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个是嵌套循环
实现之后发现新加的数据值和列名没有对上
求解决办法

解决方案 »

  1.   

    你这个情况,在SQL中处理一下就可以了。
      

  2.   

    刚才那帖子被移到sql版就被沉贴了人都没有了。
      

  3.   


    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)  
      

  4.   

    写sql的话~存储过程用不了啊,access破数据库
      

  5.   

    这不是存储过程,就是SQL语句。
      

  6.   

    噢~这样好像还真可以我把这条sql简化下。。
      

  7.   

    这个能直接写成一条sql语句么?
      

  8.   


    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];
      

  9.   

    当我多一个name5的时候的话,那不是还要写一条sql?
    不符合我动态添加的条件啊。。
      

  10.   

    假如我用这个,怎么写在程序里,我做的是winform。
      

  11.   

    你的是Access的呀,Access使用的是Jet-SQL,那么你 利用交叉表查询,用查询向导创建 如下语句transform   sum(FContext )
    select   InfoID from  A 
    group   by   InfoID 
    pivot   FName 试试看
      

  12.   

    sum(FContext )
    出来的是数量而不是这个对应的值
      

  13.   

    不用sql,用datatable该怎么操作。
    c#,vb。net都可以
    求代码。
      

  14.   

    string str=select Name,FContext FORM A将获取到的数据存储到dataset中
    SqlDataApter sda=new SqlDataApter(str,con);
    DataSet ds=sda.Fill()
    DataTable dt=ds.Table[0];
    然后for读取数据
    再将数据添加到B表中
      

  15.   

    在下很懒,不想建库了,就自己拼了个:using System;
    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);
            }
        }
    }