求个复杂的SQL语句,急

loveshrimp423 2013-08-27 04:48:48
现有一个语句的查询结果是这样
语句
select c.voucher_no,b.title,b.wage_set_type,b.data_month,d.dept_id,a.emp_id,d.note_info,a.wage_subject_id,a.val from wage_set_val a,wage_set b,ebs_v c,wage_set_emp d where a.voucher_id =
b.voucher_id and b.voucher_id = c.voucher_id and c.voucher_id = d.voucher_id and a.emp_id=d.emp_id and b.data_month between '201001' and '201308' and d.dept_id in(select dept_id from
emp_dept where company_id in (select val from mup_user_bo where user_id='admin' and bo_id='emp_company'))
order by
c.voucher_no,b.title,b.wage_set_type,b.data_month,d.dept_id,a.emp_id,d.note_info,a.wage_subject_id
结果



要显示成横向的,要怎么改效果是下图


wage_subject_id,和val就是工资科目和金额
...全文
164 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveshrimp423 2013-08-28
  • 打赏
  • 举报
回复
大家帮帮忙,在线等,差这最后一点了
loveshrimp423 2013-08-28
  • 打赏
  • 举报
回复
[quote=引用 12 楼 wwwwgou 的回复:] declare @sql varchar(8000) select @sql = isnull(@sql + '],[' , '') + wage_subject_name from wage_subject where wage_subject_id in (select a.wage_subject_id from wage_set_val a,wage_set b where b.voucher_id=a.voucher_id and a.voucher_id='4' and a.emp_id='1473') group by wage_subject_name set @sql='['+@sql+']' select @sql 老兄啊,我这段已经可以提取生成各人相应的科目名,把@sql变量放到后面这个in里为什么会出错呀
loveshrimp423 2013-08-28
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + wage_subject_name
from wage_subject
where
wage_subject_id in (select a.wage_subject_id from wage_set_val a,wage_set b where b.voucher_id=a.voucher_id and a.voucher_id='4' and a.emp_id='1473')
group by wage_subject_name
set @sql='['+@sql+']'
select @sql

老兄啊,我这段已经可以提取生成各人相应的科目名,把@sql变量放到后面这个in里为什么会出错呀



---涛声依旧--- 2013-08-28
  • 打赏
  • 举报
回复
引用 11 楼 loveshrimp423 的回复:
老兄,请问join怎么写。科目中文在wage_subject表里,字段是wage_subject_name,跟a表的关联的wage_subject_id. 我直接就在from里加多一个wage_subject,where里加入e.wage_subject_id=a.wage_subject_id报错,没出来

SELECT *
FROM
(
    SELECT  c.voucher_no ,
            b.title ,
            b.wage_set_type ,
            b.data_month ,
            d.dept_id ,
            a.emp_id ,
            d.note_info ,
            e.wage_subject_name ,    --如果列名在wage_set_val表中有存,直接把这个字段换成列名.
            a.val
    FROM    wage_set_val a 
    INNER JOIN wage_set b ON a.voucher_id = b.voucher_id
    INNER JOIN ebs_v c ON b.voucher_id = c.voucher_id
    INNER JOIN wage_set_emp d ON c.voucher_id = d.voucher_id AND a.emp_id = d.emp_id
	INNER JOIN wage_subject E ON e.wage_subject_id=a.wage_subject_id
    WHERE  b.data_month BETWEEN '201001' AND '201308'
            AND d.dept_id IN (
            SELECT  dept_id
            FROM    emp_dept
            WHERE   company_id IN ( SELECT  val
                                    FROM    mup_user_bo
                                    WHERE   user_id = 'admin'
                                            AND bo_id = 'emp_company' ) )
) a
PIVOT
(
    MAX(val) FOR wage_subject_name IN([基本工资],[固定加班工资],[岗位工资])    --这儿自己补全
) b
loveshrimp423 2013-08-28
  • 打赏
  • 举报
回复
我写的跟你一样,我的就出错,你的就能运行,没天理。我对了没打错呀。谢谢你呀,老兄
Shawn 2013-08-28
  • 打赏
  • 举报
回复
引用 11 楼 loveshrimp423 的回复:
老兄,请问join怎么写。科目中文在wage_subject表里,字段是wage_subject_name,跟a表的关联的wage_subject_id. 我直接就在from里加多一个wage_subject,where里加入e.wage_subject_id=a.wage_subject_id报错,没出来
SELECT *
FROM
(
    SELECT  c.voucher_no ,
            b.title ,
            b.wage_set_type ,
            b.data_month ,
            d.dept_id ,
            a.emp_id ,
            d.note_info ,
            e.wage_subject_name ,    --如果列名在wage_set_val表中有存,直接把这个字段换成列名.
            a.val
    FROM    wage_set_val a ,
            wage_set b ,
            ebs_v c ,
            wage_set_emp d,
			wage_subject E	--写在这儿
    WHERE   a.voucher_id = b.voucher_id
            AND b.voucher_id = c.voucher_id
            AND c.voucher_id = d.voucher_id
            AND a.emp_id = d.emp_id
			AND e.wage_subject_id=a.wage_subject_id
            AND b.data_month BETWEEN '201001' AND '201308'
            AND d.dept_id IN (
            SELECT  dept_id
            FROM    emp_dept
            WHERE   company_id IN ( SELECT  val
                                    FROM    mup_user_bo
                                    WHERE   user_id = 'admin'
                                            AND bo_id = 'emp_company' ) )
) a
PIVOT
(
    MAX(val) FOR wage_subject_name IN([基本工资],[固定加班工资],[岗位工资])    --这儿自己补全
) b
loveshrimp423 2013-08-28
  • 打赏
  • 举报
回复
老兄,请问join怎么写。科目中文在wage_subject表里,字段是wage_subject_name,跟a表的关联的wage_subject_id. 我直接就在from里加多一个wage_subject,where里加入e.wage_subject_id=a.wage_subject_id报错,没出来
Shawn 2013-08-27
  • 打赏
  • 举报
回复
引用 9 楼 loveshrimp423 的回复:
嗯,谢谢,那列名可以出来不,02,01,03这些列名改为相对应的中文,这样做网页就简单,不然后要一个部门改一下代码,太麻烦了
SELECT *
FROM
(
    SELECT  c.voucher_no ,
            b.title ,
            b.wage_set_type ,
            b.data_month ,
            d.dept_id ,
            a.emp_id ,
            d.note_info ,
            a.wage_subject_id ,	--如果列名在wage_set_val表中有存,直接把这个字段换成列名.
            a.val
    FROM    wage_set_val a ,
            wage_set b ,
            ebs_v c ,
            wage_set_emp d	--如果这些表中都没有,就再JOIN一下有列名的表.把a.wage_subject_id替换掉
    WHERE   a.voucher_id = b.voucher_id
            AND b.voucher_id = c.voucher_id
            AND c.voucher_id = d.voucher_id
            AND a.emp_id = d.emp_id
            AND b.data_month BETWEEN '201001' AND '201308'
            AND d.dept_id IN (
            SELECT  dept_id
            FROM    emp_dept
            WHERE   company_id IN ( SELECT  val
                                    FROM    mup_user_bo
                                    WHERE   user_id = 'admin'
                                            AND bo_id = 'emp_company' ) )
) a
PIVOT
(
    MAX(val) FOR wage_subject_id IN([01],[02],[03],[04],[05],[06],[07],[10],[11],[13])	--注意:上面替换后,这儿就应该变成名称了:[基本工资],[固定加班工资],[岗位工资]....
) b
loveshrimp423 2013-08-27
  • 打赏
  • 举报
回复
嗯,谢谢,那列名可以出来不,02,01,03这些列名改为相对应的中文,这样做网页就简单,不然后要一个部门改一下代码,太麻烦了
Shawn 2013-08-27
  • 打赏
  • 举报
回复
引用 6 楼 loveshrimp423 的回复:
嗯,这个我知道,问题是不同部门的人科目不一样,不然就只能分部门了。根据不同部门来设这个
只能分部门了。没办法。
loveshrimp423 2013-08-27
  • 打赏
  • 举报
回复
就SQL的角度有没办法动态去掉没值的列呢?
loveshrimp423 2013-08-27
  • 打赏
  • 举报
回复
嗯,这个我知道,问题是不同部门的人科目不一样,不然就只能分部门了。根据不同部门来设这个
---涛声依旧--- 2013-08-27
  • 打赏
  • 举报
回复
如果该科目全部人都没有的话,可以在下面中的相应地去掉该科目 wage_subject_id IN([01],[02],[03],[04],[05],[06],[07],[10],[11],[13]) 如果[01]都没有的话,则: wage_subject_id IN([02],[03],[04],[05],[06],[07],[10],[11],[13])
Shawn 2013-08-27
  • 打赏
  • 举报
回复
引用 2 楼 loveshrimp423 的回复:
谢了,老兄,确实可以实现,还有个问题,像工号1549,他只有三个工资科目,这里是全部列出来了,能不能没有的列不显示?
因为这个查询是一个整体。列是不会少的。如果楼主不喜欢上面的NULL值,SELECT后面就不要写*,而用ISNULL([01], '')来替换即可。
loveshrimp423 2013-08-27
  • 打赏
  • 举报
回复
loveshrimp423 2013-08-27
  • 打赏
  • 举报
回复
谢了,老兄,确实可以实现,还有个问题,像工号1549,他只有三个工资科目,这里是全部列出来了,能不能没有的列不显示?
Shawn 2013-08-27
  • 打赏
  • 举报
回复
SELECT *
FROM
(
	SELECT  c.voucher_no ,
			b.title ,
			b.wage_set_type ,
			b.data_month ,
			d.dept_id ,
			a.emp_id ,
			d.note_info ,
			a.wage_subject_id ,
			a.val
	FROM    wage_set_val a ,
			wage_set b ,
			ebs_v c ,
			wage_set_emp d
	WHERE   a.voucher_id = b.voucher_id
			AND b.voucher_id = c.voucher_id
			AND c.voucher_id = d.voucher_id
			AND a.emp_id = d.emp_id
			AND b.data_month BETWEEN '201001' AND '201308'
			AND d.dept_id IN (
			SELECT  dept_id
			FROM    emp_dept
			WHERE   company_id IN ( SELECT  val
									FROM    mup_user_bo
									WHERE   user_id = 'admin'
											AND bo_id = 'emp_company' ) )
) a
PIVOT
(
	MAX(val) FOR wage_subject_id IN([01],[02],[03],[04],[05],[06],[07],[10],[11],[13])
) b

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧