代码实现SQL Server动态行转列,不用存储过程
分两步查询,第一步查询出动态列,第二步使用PIVOT函数。
代码:
List<DataTable> dataTableList = new List<DataTable>(); #region 指标
DataTable dtEvaItemTitle = db.RunTable<Edu_EvaluationRecord>(string.Format(@"
select distinct eva.id, eva.name
from Edu_EvaluationRecord r
left join Edu_QnVolume v on r.queryid=v.id
left join Sys_EvaluationItem eva on r.evaitemid=eva.id
where v.id={0}
order by eva.id", volumeEva.Id));
List<string> evaItemTitleList = new List<string>();
for (int i = ; i < dtEvaItemTitle.Rows.Count; i++)
{
evaItemTitleList.Add(string.Format("[{0}]", dtEvaItemTitle.Rows[i]["name"].ToString()));
}
string evaItemTitles = String.Join(",", evaItemTitleList.ToArray()); string sql = string.Format(@"
select * from
(select stu.name as 姓名,stu.StuNum as 学号,stu.ExamNum as 考号,
case when stu.Sex='1' then '男' else '女' end as 姓别,
case when stu.Brothers='1' then '否' else '是' end as 是否独生,
stu.EduF as 父亲文化,stu.EduM as 母亲文化,
r.score as 分数,eva.Name as 题目
from Edu_EvaluationRecord r
left join Edu_Student stu on r.userid=stu.id
left join Sys_User u on stu.userid=u.id
left join Edu_QnVolume v on r.queryid=v.id
left join Sys_EvaluationItem eva on r.evaitemid=eva.id
where v.id={0}) p
pivot (sum(分数) for 题目 in ({1}))
as pvt", volumeEva.Id, evaItemTitles);
DataTable dt = db.RunTable<Edu_EvaluationRecord>(sql);
dt.TableName = volumeEva.Name;
dataTableList.Add(dt);
#endregion #region 普通
DataTable dtItemTitle = db.RunTable<Edu_EvaluationRecord>(string.Format(@"
select distinct s.id, s.title
from edu_qnanswer ans
left join Edu_QnSubject s on s.id=ans.subjectid
left join Edu_QnVolume v on s.volumeid=v.id
where v.id={0}
order by s.id", volumeGeneral.Id));
List<string> itemTitleList = new List<string>();
for (int i = ; i < dtItemTitle.Rows.Count; i++)
{
itemTitleList.Add(string.Format("[{0}]", dtItemTitle.Rows[i]["title"].ToString()));
}
string itemTitles = String.Join(",", itemTitleList.ToArray()); sql = string.Format(@"
select * from
(select stu.name as 姓名,stu.StuNum as 学号,stu.ExamNum as 考号,
case when stu.Sex='1' then '男' else '女' end as 姓别,
case when stu.Brothers='1' then '否' else '是' end as 是否独生,
stu.EduF as 父亲文化,stu.EduM as 母亲文化,
ans.Answercontent as 选项,s.Title as 题目
from edu_qnanswer ans
left join Sys_User u on ans.answerid=u.id
left join Edu_Student stu on stu.userid=u.id
left join Edu_QnSubject s on s.id=ans.subjectid
left join Edu_QnVolume v on s.volumeid=v.id
where v.id={0}) p
pivot (max(选项) for 题目 in ({1}))
as pvt", volumeGeneral.Id, itemTitles);
dt = db.RunTable<Edu_EvaluationRecord>(sql);
dt.TableName = volumeGeneral.Name;
dataTableList.Add(dt);
#endregion
代码实现SQL Server动态行转列,不用存储过程的更多相关文章
- SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段值)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL, ...
- SQL Server 动态行转列(轉載)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段; 方法二:使用拼接SQL, ...
- SQL server 动态行转列
用聚合函数配合CASE语句实现行转列功能: 现在分享一下具体实现代码: 转换前效果: PlanName PlanType PlanLimit 计划1 计划类型1 RMB 1,000,000 计划1 计 ...
- 转:SQL Server 动态行转列
http://www.cnblogs.com/gaizai/p/3753296.html http://www.cnblogs.com/maanshancss/archive/2013/03/13/2 ...
- 老生常谈之SQL Server (行转列,列转行)
Open the first article 在本文章中主要介绍以下内容: 1.静态行转列 2.静态列转行 3.动态行转列 4.动态列转行 1.静态行转列 --静态的行转列 --新建一个科目成绩表 - ...
- SQL Server pivot 行转列遇到的问题
前段时间开发系统时,有个功能是动态加载列,于是就使用了SQL Server自带的PIVOT函数进行行转列,开始用的非常溜,效果非常好.但是提交测试后问题来了,测试添加的列名中包含空格,然后就杯具了,功 ...
- SQL SERVER特殊行转列案列一则
今天有个同事找我,他说他有个需求,需要进行行转列,但是又跟一般的行转列有些区别,具体需求如下所说,需要将表1的数据转换为表2的显示格式. 我想了一下,给出了一个解决方法,具体如下所示(先给出测试数据) ...
- sql server 2005+ 行转列
)) , 'aa') , 'bb') , 'aaa') , 'bbb') , 'ccc') go , , '') from tb group by id
- sql server数据库行转列及巧用case when、和row_number用法例子
select 身份证号码, MAX(t.单位编号) 单位编号, MAX(t.姓名) 姓名, MAX(case when t.rows=1 then convert(varchar(max),疾病名称) ...
随机推荐
- 设计模式之美:Role Object(角色对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Role Object 的示例实现. 意图 通过明确地附加角色对象到目标对象中,以使对象可以适配不同的客户需求.每个角色对象都代 ...
- C# WPF获取任务栏时间区域的Rectangle
[StructLayout(LayoutKind.Sequential)] public struct WindowRect { public int left; public int top; pu ...
- Java提高篇(三四)-----fail-fast机制
在JDK的Collection中我们时常会看到类似于这样的话: 例如,ArrayList: 注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证.快速失 ...
- 微信分享调用 -- c#篇
微信分享调用JS -- c#篇 1.前端 1.1 导入微信端的JS 如果你的网址是http,则地址为 http://res.wx.qq.com/open/js/jweixin-1.0.0.js ...
- Java-集合练习题1
第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...
- HTML表单入门基础
网页镶嵌: <iframe src="http://www.cnblogs.com/tfl-511/" width="200" height=" ...
- 缓存篇~第七回 Redis实现基于方法签名的数据集缓存(可控更新,分布式数据缓存)
返回目录 本篇文章可以说是第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存(可控更新,WEB端数据缓存)的续篇,事实上,有 ...
- Atitit atiuse软件系列
Atitit atiuse软件系列 1.1. Atian inputmethod 输入法 方言与多语言多文字支持 (au)1 1.2. File searcher 文件搜索器,支持压缩文件与正则表达 ...
- localStorage使用
localStorage使用 需要注意的是,HTML5本地存储只能存字符串,任何格式存储的时候都会被自动转为字符串,所以读取的时候,需要自己进行类型的转换. 支持的情况如上图,IE在8.0的时候就支持 ...
- ini_set("display_errors","On");和error_reporting(E_ALL);
在用php做网站开发的时候 , 为防止用户看到错误信息,而出现的不友好界面.故一般性会在php.ini里设置:display_errors = Off;不过在开发的时候,我们有时候需要打开错误信息.这 ...