有三个表:
1、员工基本资料表2、员工保险资料表3、保险基本资料表想得到如下结果:
能否用一个语句或用view来实现,请高手不吝赐教,谢谢!
1、员工基本资料表2、员工保险资料表3、保险基本资料表想得到如下结果:
能否用一个语句或用view来实现,请高手不吝赐教,谢谢!
解决方案 »
- 变量赋值
- 请问SQL数据库导入数据中文是乱码如何处理呢?数据库的默认语言已经改了,但还是不行!
- conn.execute(sql)执行删除的时候怎么判断找到找不到啊?
- 求SQL语句在一表内按某字段分组统计数据
- 求助:关于得到离查询日期当周最新日期数据的sql写法
- 向鸟哥提问
- 在sql2000中varchar(8000),text,ntext字段类型中,存储两三千字的文字可是存储时只截取其中的七八百字,其他的无法存储,用命令好还是在管理器中直接在表中存好,该如何存???
- bulk命令的问题
- 修改表结构问题?
- sql server遇到一个查询不会写 怎么查
- Sql Server2008 R2安装问题
- 先进先出求帮助~~
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.保险内码
加了group by后能显示结果,但是忘了说名,保险内码和保险种类的数量是不确定的,也就是说现在是3个保险,可能随时会变成4个,5个,不知能不能根据保险基本资料表来动态产生max的内容,谢谢!
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;
大概就是这么个情况,你的需求和我的类似。
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)
*/
(员工内码 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)
*/