当前位置: 代码迷 >> ASP.NET >> 小弟我又来了,还是那个数据行列转换有关问题,求解
  详细解决方案

小弟我又来了,还是那个数据行列转换有关问题,求解

热度:4265   发布时间:2013-02-25 00:00:00.0
我又来了,还是那个数据行列转换问题,求解
表:t_selfcheck

表:t_selfchecktype

这是跟据条件查询出的结果


上面是我查询的某人当天的记录,但最后想要的结果是数据的行列转换下,结果如下:

收缩压上 舒张压下 血糖前 血糖后 体温 心率 时间

120 90 34 36 37.50 150 13时19分

180 110 33 38 39 190 16时30分

求各位帮帮忙 啊,这个不能在数据库中进行操作啊。只能在页面后台进行数据行列转换。求解。

求后台代码。



------解决方案--------------------------------------------------------
固定的比较简单,用阅读器读取记录(用DataTable也可以),确定行号和列表,填充即可。
------解决方案--------------------------------------------------------
第一个方案:在oracle后台创建一个函数和一个临时表 ,利用函数转换将行列数据的结果写入临时表。前台调用临时表的数据就行。

第二个方案:在程序中创建两个databale1, databale2 。
databale1接收数据集的原始数据,然后遍历databale1 将行列数据整理 存入databale2,不过这种执行效力低些。

推荐用第一个方案。
------解决方案--------------------------------------------------------
第一个方案:在oracle后台创建一个函数和一个临时表 ,利用函数转换将行列数据的结果写入临时表。前台调用临时表的数据就行。

第二个方案:在程序中创建两个databale1, databale2 。
databale1接收数据集的原始数据,然后遍历databale1 将行列数据整理 存入databale2,不过这种执行效力低些。

推荐用第一个方案。
------解决方案--------------------------------------------------------
假设以1楼最后一个图片中信息:
C# code
        DataTable dt = new DataTable();        dt.Columns.Add("收缩压上", typeof(int));        dt.Columns.Add("舒张压下", typeof(int));        dt.Columns.Add("血糖餐前", typeof(int));        dt.Columns.Add("血糖餐后", typeof(int));        dt.Columns.Add("体温", typeof(float));        dt.Columns.Add("心率", typeof(int));        dt.Columns.Add("时间", typeof(string));        OleDbData md = new OleDbData();        md.ExecuteReader("select * from Test");        //请改成自己的sql语句        DataRow dr = null;        while (md.Reader.Read())        {            if (md.Reader["typename"].ToString() == "收缩压上")            {                dr = dt.NewRow();                dt.Rows.Add(dr);            }            dr[md.Reader["typename"].ToString()] = md.Reader["collectdata"];            if (md.Reader["typename"].ToString() == "心率")                dr["时间"] = ((DateTime)md.Reader["collecttime"]).ToString("HH时mm分");        }        md.Close();        GridView1.DataSource = dt;        GridView1.DataBind();
------解决方案--------------------------------------------------------
地址贴错了,运行结果如下:

------解决方案--------------------------------------------------------
dt换成你从数据库中查询出来的数据。
C# code
static void Main(string[] args)        {            DataTable dt = new DataTable();            dt.Columns.Add("collectdata");            dt.Columns.Add("typename");            dt.Columns.Add("collecttime");            dt.Rows.Add(new object[] { "120.00", "收缩压上", "2012/5/11 13:19:45" });            dt.Rows.Add(new object[] { "90.00", "舒张压下", "2012/5/11 13:19:46" });            dt.Rows.Add(new object[] { "34.00", "血糖餐前", "2012/5/11 13:19:47" });            dt.Rows.Add(new object[] { "36.00", "血糖餐后", "2012/5/11 13:19:48" });            dt.Rows.Add(new object[] { "37.50", "体温", "2012/5/11 13:19:49" });            dt.Rows.Add(new object[] { "180.00", "收缩压上", "2012/5/11 16:30:31" });            dt.Rows.Add(new object[] { "110.00", "舒张压下", "2012/5/11 16:30:31" });            dt.Rows.Add(new object[] { "33.00", "血糖餐前", "2012/5/11 16:30:33" });            dt.Rows.Add(new object[] { "38.00", "血糖餐后", "2012/5/11 16:30:34" });            dt.Rows.Add(new object[] { "39.00", "体温", "2012/5/11 16:30:35" });            dt.Rows.Add(new object[] { "190.00", "心率", "2012/5/11 16:30:36" });            dt.Rows.Add(new object[] { "150.00", "心率", "2012/5/11 13:19:50" });            DataTable newDt = new DataTable();            Dictionary<string, int> dicCount = new Dictionary<string, int>();            int index = 0;            foreach (DataRow row in dt.Rows)            {                if (!dicCount.ContainsKey(row["typename"].ToString()))                {                    dicCount.Add(row["typename"].ToString(), index++);                }            }            Dictionary<string, List<string>> dic = new Dictionary<string, List<string>>();            List<string> list;            string key = string.Empty;            foreach (DataRow row in dt.Rows)            {                key = Convert.ToDateTime(row["collecttime"]).ToString("HH时mm分");                if (dic.ContainsKey(key))                {                    list = dic[key];                    list[dicCount[row["typename"].ToString()]] = row["collectdata"].ToString();                    dic[key] = list;                }                else                {                    list = new List<string>();                    list.AddRange(new string[dicCount.Count]);                    list.Add(key);                    list[dicCount[row["typename"].ToString()]] = row["collectdata"].ToString();                    dic.Add(key, list);                }            }            foreach (KeyValuePair<string, int> k in dicCount)                newDt.Columns.Add(k.Key);            newDt.Columns.Add("时间");            foreach (KeyValuePair<string, List<string>> k in dic)                newDt.Rows.Add(k.Value.ToArray<string>());            /*                            120.00    90.00    34.00    36.00    37.50    150.00    13时19分                180.00    110.00    33.00    38.00    39.00    190.00    16时30分             */            Console.ReadKey();        }
  相关解决方案