代码实现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 = 0; 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 = 0; 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

时间: 2024-08-28 11:03:55

代码实现SQL Server动态行转列,不用存储过程的相关文章

SQL Server 动态行转列(参数化表名、分组列、行转列字段、字段

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段: 方法二:使用拼接SQL,动态列字段: 方法三:使用PIVOT关系运算符,静态列字段: 方法四:使用PIVOT关系运算符,动态列字段: 扩展阅读一:参数化表名.分组列.行转列字段.字段值: 扩展阅读二:在前面的基础上加入条件过滤: 参考文献(References) 二.背景(Contexts) 其实行转列并不是一个什么新鲜的

SQL server 动态行转列

在学习数据库的时候,遇到了怎么把数据表中的内容转变成数据表的字段,在此,记录一下自己对行转列的理解 比如有个学生成绩表: stuid:学号 course:科目 score:成绩 表的内容为: stuid course score 0101 语文     78 0101 数学     90 0101 英语     67 0101 物理     88 而我们想要的是类似下表: stuid 语文 数学 英语 物理 0101  78 90 67  88 这个时候就需要用到行转列,行转列有动态与静态之分:

SQL Server 动态行转列(轉載)

一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 方法一:使用拼接SQL,静态列字段; 方法二:使用拼接SQL,动态列字段; 方法三:使用PIVOT关系运算符,静态列字段; 方法四:使用PIVOT关系运算符,动态列字段; 二.背景(Contexts) 其实行转列并不是一个什么新鲜的话题了,甚至已经被大家说到烂了,网上的很多例子多多少少都有些问题,所以我希望能让大家快速的看到执行的效果,所以在动态列的基础上再把

转:SQL Server 动态行转列

http://www.cnblogs.com/gaizai/p/3753296.html http://www.cnblogs.com/maanshancss/archive/2013/03/13/2957108.html

SQL SERVER特殊行转列案列一则

原文:SQL SERVER特殊行转列案列一则 今天有个同事找我,他说他有个需求,需要进行行转列,但是又跟一般的行转列有些区别,具体需求如下所说,需要将表1的数据转换为表2的显示格式. 我想了一下,给出了一个解决方法,具体如下所示(先给出测试数据) INSERT INTO TEST SELECT 1,    1,    '定型名称',    '预定型'           UNION ALL SELECT 1,    2,    '进布方式',    '调平'             UNION 

通过sql实现动态行转列

上一章我们讲了固定行转列,本章我们就将一下怎么动态实现行转列的.因为有时候需要行专列的值有成千上万条,不可能再用固定行转列的方法,否则你一定会崩溃掉的.好了,废话不多说,开始吧!常见一张表tmp_test,内容如下: 实现代码:create or replace procedure p_test isv_sql varchar2(2000); cursor cursor_1 isselect distinct subject from tmp_test order by subject; beg

SQL SERVER PIVOT 行转列、列传行

在数据库操作中,有些时候我们遇到需要实现"行转列"的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL) 我们先插入一些模拟数据: INSERT INTO WEEK_INCOME SELECT '星期一',1000 UNION ALL SELECT '星期二',2000 UNION ALL SELECT '星期三',3000 UNION ALL SELECT '星期四',4000 UNION ALL SE

sql server 2012 行转列

table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) 对于一个字段的汇总和转置,只用一次. ) tb pivot(max(copies) for ORDER_TYPE in ([11],[12],[13],[14])) tb 对于多个字段的汇总和转置,要嵌套多次. ) tb pivot(max(copies) for ORDER_TYPE in ([11],[12],[13],[14])) tb

动态行转列 pivot实现

declare @sql varchar(8000)    begin              set @sql=''  --初始化变量@sql              select  @[email protected]+',['+ convert(varchar(10),CreateDate,120)+']' from  vwStationYield               where CreateDate > DATEADD(dd,-14,convert(varchar(10),g