zoukankan      html  css  js  c++  java
  • 代码实现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
    View Code
  • 相关阅读:
    Essential C++ 3.1 节的代码练习——哨兵方式
    Essential C++ 3.1 节的代码练习——指针方式
    《搞不定人,你如何带团队?》读书记录
    selenium+python,解决selenium弹出新页面,无法定位元素的问题(报错:Unable to locate element:元素)
    selenium 元素(class_name、link_text、css_selector)定位方法
    selenium+python+eclipse 实现 “问卷星”网站,登录与检查登录示例!
    selenium IDE中log的保存与查看方法
    selenium IDE工具页面介绍!
    selenium IDE 使用方法整理
    selenium IDE的3种下载安装方式
  • 原文地址:https://www.cnblogs.com/s0611163/p/5052978.html
Copyright © 2011-2022 走看看