有三个表:
1、员工基本资料表2、员工保险资料表3、保险基本资料表想得到如下结果:
能否用一个语句或用view来实现,请高手不吝赐教,谢谢!

解决方案 »

  1.   

    select
       a.工号,a.姓名,
       max(case when c.保险内码=1 then b.个人负担比率 else '' end) as 养老保险个人负担比率,
       max(case when c.保险内码=1 then b.个人负担金额 else '' end) as 养老保险个人负担金额,
       max(case when c.保险内码=2 then b.个人负担比率 else '' end) as 医疗保险个人负担比率,
       max(case when c.保险内码=2 then b.个人负担金额 else '' end) as 医疗保险个人负担金额,
       max(case when c.保险内码=3 then b.个人负担比率 else '' end) as 失业保险个人负担比率,
       max(case when c.保险内码=3 then b.个人负担金额 else '' end) as 失业保险个人负担金额
    from
       员工基本资料表 a,
       员工保险资料表 b,
       保险基本资料表 c
    where
       a.员工内码=b.员工内码
    and
       b.保险内码=c.保险内码
      

  2.   

    谢谢 fredrickhu,
    加了group by后能显示结果,但是忘了说名,保险内码和保险种类的数量是不确定的,也就是说现在是3个保险,可能随时会变成4个,5个,不知能不能根据保险基本资料表来动态产生max的内容,谢谢!
      

  3.   

    先把你要的内空查询出来,到代码去处理,table动态绑定第个数据。  StringBuilder sb_th = new StringBuilder();//表头
                StringBuilder sb_td = new StringBuilder();//行
      //添加固有的列
                if (dtitem != null && dtitem.Rows.Count > 0)
                {
                    sb_th.Append("<tr>");
                    sb_th.Append("<th rowspan='2' >序号</th>");
                    sb_th.Append("<th rowspan='2'>编号</th>");
                    sb_th.Append("<th rowspan='2'>酒店名称</th>");
                    sb_td.Append("<tr>");
                    dthotel.Columns.Add("序号");
                    dthotel.Columns.Add("编号");
                    dthotel.Columns.Add("酒店名称");
                    for (int i = 0, count = dtitem.Rows.Count; i < count; i++)
                    {
                        if (dtitem.Rows[i]["IFCName"].ToString() != "")
                        {
                            sb_th.Append("<th colspan='3'>" + dtitem.Rows[i]["IFCName"] + "</th>");
                            sb_td.Append("<td >去年同期</td>");
                            sb_td.Append("<td >得分</td>");
                            sb_td.Append("<td >同比</td>");
                            dthotel.Columns.Add(dtitem.Rows[i]["ITCName"] + "去年同期");
                            dthotel.Columns.Add(dtitem.Rows[i]["ITCName"] + "得分");
                            dthotel.Columns.Add(dtitem.Rows[i]["ITCName"] + "同比");
                        }
                        //sb_th.Append("<tr><td>" + dt.Rows[i]["费用"] + "</td></tr>");
                    }
                    sb_th.Append("<th rowspan='2'>综合得分</th>");
                    sb_th.Append("</tr>");
                    sb_th.Append("</tr>");
                    for (int y = 0; y < dthotel.Rows.Count; y++)
                    {
                        DataRow dr = dthotel.NewRow();                    int no = y + 1;
                        sb_td.Append("<tr>");
                        sb_td.Append("<td >" + no + "</td>");
                        sb_td.Append("<td >" + dthotel.Rows[y]["HotelCD"] + "</td>");
                        sb_td.Append("<td >" + dthotel.Rows[y]["HotelName"] + "</td>");
                        dr["序号"] = no;
                        dr["编号"] = dthotel.Rows[y]["HotelCD"];
                        dr["酒店名称"] = dthotel.Rows[y]["HotelName"];
                        decimal CheckScoringRate = 0;
                        for (int i = 0, count = dtitem.Rows.Count; i < count; i++)
                        {
                            string hotelcd = dthotel.Rows[y]["HotelCD"].ToString();
                            string item = dtitem.Rows[i]["IFCName"].ToString();
                            DataView dtv = dt.DefaultView;
                            dtv.RowFilter = "HotelCD='" + hotelcd + "' and IFCName= '" + item + "'";
                            dts = dtv.ToTable();                        if (dts != null && dts.Rows.Count > 0)
                            {
                                CheckScoringRate = Convert.ToDecimal(dts.Rows[0]["ScoringRate"]);
                                if (dts.Rows[0]["IFCName"].ToString() == dtitem.Rows[i]["IFCName"].ToString())
                                {
                                    sb_td.Append("<td >" + dts.Rows[0]["oldscore"] + "</td>");                                sb_td.Append("<td >" + dts.Rows[0]["score"] + "</td>");                                sb_td.Append("<td >" + dts.Rows[0]["OfStand"] + "</td>");
                                }
                                else
                                {
                                    sb_td.Append("<td ></td>");
                                    sb_td.Append("<td ></td>");
                                    sb_td.Append("<td ></td>");
                                }                        }
                            else
                            {
                                sb_td.Append("<td ></td>");
                                sb_td.Append("<td ></td>");
                                sb_td.Append("<td ></td>");                        }
                        }                    sb_td.Append("<td >" + CheckScoringRate + "</td>");
                        sb_td.Append("</tr>");
                    }
                    table = "<table border='1' width='1220px' cellspacing='0' cellpadding='1' class='tabel-R'>" + sb_th.ToString() + sb_td.ToString() + "</table>";
                }
                else
                {
                    sb_th.Append("<tr>");
                    sb_th.Append("<th  >序号</th>");
                    sb_th.Append("<th>编号</th>");
                    sb_th.Append("<th >酒店名称</th>");
                    sb_th.Append("<th >综合得分</th>");
                    sb_th.Append("</tr>");
                    sb_td.Append("<tr>");
                    sb_td.Append("<td colspan='4' >暂无数据</td>");
                    sb_td.Append("</tr>");
                    table = "<table border='1' width='100%' cellspacing='0' cellpadding='1' class='tabel-R'>" + sb_th.ToString() + sb_td.ToString() + "</table>";
                }            Litb.Text = table;
     大概就是这么个情况,你的需求和我的类似。
      

  4.   


    create table 员工基本资料表
    (员工内码 int,工号 varchar(10),姓名 varchar(10))create table 员工保险资料表
    (内码 int,员工内码 int,保险内码 int,个人负担比率 varchar(5),个人负担金额 varchar(5))create table 保险基本资料表
    (保险内码 int,代号 varchar(10),名称 varchar(10))insert into 员工基本资料表
     select 1,'130001','张三' union all
     select 1,'130002','李四' union all
     select 1,'130003','王五' union all
     select 1,'130004','赵六'insert into 员工保险资料表
     select 1,1,1,'2%','20' union all
     select 2,1,2,'3%','30' union all
     select 3,1,3,'5%','50' union all
     select 4,2,1,'2%','20' union all
     select 5,2,2,'3%','30' union all
     select 6,3,1,'2%','20' union all
     select 7,4,1,'2%','20' union all
     select 8,4,2,'3%','30' union all
     select 9,4,3,'5%','50'insert into 保险基本资料表
     select 1,'001','养老保险' union all
     select 2,'002','医疗保险' union all
     select 3,'003','失业保险'
     declare @tsql varchar(6000)select @tsql=isnull(@tsql+',','')
                +'max(case when c.名称='''+名称+''' then a.个人负担比率 else '''' end) '''+名称+'个人负担比率'', '
                +'max(case when c.名称='''+名称+''' then a.个人负担金额 else '''' end) '''+名称+'个人负担金额'' '
      from 保险基本资料表select @tsql='select b.工号,b.姓名,'+@tsql
                +' from 员工保险资料表 a '
                +' inner join 员工基本资料表 b on a.员工内码=b.员工内码 '
                +' inner join 保险基本资料表 c on a.保险内码=c.保险内码 '
                +' group by b.员工内码,b.工号,b.姓名 '
                +' order by b.员工内码 'exec(@tsql)
     
    /*
    工号         姓名        养老保险个人负担比率 养老保险个人负担金额 医疗保险个人负担比率 医疗保险个人负担金额 失业保险个人负担比率 失业保险个人负担金额
    ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
    130001     张三         2%         20         3%         30         5%         50
    130002     李四         2%         20         3%         30         5%         50
    130003     王五         2%         20         3%         30         5%         50
    130004     赵六         2%         20         3%         30         5%         50(4 row(s) affected)
    */
      

  5.   

    sorry! 4楼代码有bug,修正,create table 员工基本资料表
    (员工内码 int,工号 varchar(10),姓名 varchar(10))
     
    create table 员工保险资料表
    (内码 int,员工内码 int,保险内码 int,个人负担比率 varchar(5),个人负担金额 varchar(5))
     
    create table 保险基本资料表
    (保险内码 int,代号 varchar(10),名称 varchar(10))
     
    insert into 员工基本资料表
     select 1,'130001','张三' union all
     select 2,'130002','李四' union all
     select 3,'130003','王五' union all
     select 4,'130004','赵六'
     
    insert into 员工保险资料表
     select 1,1,1,'2%','20' union all
     select 2,1,2,'3%','30' union all
     select 3,1,3,'5%','50' union all
     select 4,2,1,'2%','20' union all
     select 5,2,2,'3%','30' union all
     select 6,3,1,'2%','20' union all
     select 7,4,1,'2%','20' union all
     select 8,4,2,'3%','30' union all
     select 9,4,3,'5%','50'
     
    insert into 保险基本资料表
     select 1,'001','养老保险' union all
     select 2,'002','医疗保险' union all
     select 3,'003','失业保险'
      
     
    declare @tsql varchar(6000)
     
    select @tsql=isnull(@tsql+',','')
                +'max(case when a.员工内码=b.员工内码 and c.名称='''+名称+''' then a.个人负担比率 else ''0%'' end) '''+名称+'个人负担比率'', '
                +'max(case when a.员工内码=b.员工内码 and c.名称='''+名称+''' then a.个人负担金额 else ''0'' end) '''+名称+'个人负担金额'' '
      from 保险基本资料表
     
    select @tsql='select b.工号,b.姓名,'+@tsql
                +' from 员工保险资料表 a '
                +' inner join 员工基本资料表 b on a.员工内码=b.员工内码 '
                +' inner join 保险基本资料表 c on a.保险内码=c.保险内码 '
                +' group by b.员工内码,b.工号,b.姓名 '
                +' order by b.员工内码 'exec(@tsql)/*
    工号         姓名         养老保险个人负担比率 养老保险个人负担金额 医疗保险个人负担比率 医疗保险个人负担金额 失业保险个人负担比率 失业保险个人负担金额
    ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
    130001     张三         2%         20         3%         30         5%         50
    130002     李四         2%         20         3%         30         0%         0
    130003     王五         2%         20         0%         0          0%         0
    130004     赵六         2%         20         3%         30         5%         50(4 row(s) affected)
    */