我又来了,还是那个数据行列转换问题,求解
表: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楼最后一个图片中信息:
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换成你从数据库中查询出来的数据。
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(); }