动态SQL,各位大牛帮忙看看

我现在有员工表,部门表.下面一个是奖项表

SQL code

--测试数据
create table #部门表 (部门ID int,部门名称 nvarchar(30))
insert into #部门表 values(1,'A')
insert into #部门表 values(2,'B')
insert into #部门表 values(3,'C')
create table #员工表 (员工编号 nvarchar(30),所属部门 int)
insert into #员工表 values('001' ,1)
insert into #员工表 values('002' ,1)
insert into #员工表 values('003' ,3)
create table #奖项表 (ID int,部门名称 nvarchar(50),奖项名称 nvarchar(50),金额 int)
insert into #奖项表 values(1,'A','质量奖',11)
insert into #奖项表 values(2,'A','安全奖',13)
insert into #奖项表 values(3,'C,A','生产奖',34)



--下面是奖项表
ID          部门名称                                               奖项名称                                               金额
----------- -------------------------------------------------- -------------------------------------------------- -----------
1           A                                                  质量奖                                                11
2           A                                                  安全奖                                                13
3           C,A                                                生产奖                                                34

(3 row(s) affected)

/*想要的结果            
员工编号   部门     质量奖    安全奖
---        ----     --------  -----
001        A        11        12
002        A        11        12

员工编号    部门    生产奖    安全奖
--------   ------   ------    ------
003          C       11       34
*/


作者: chirea   发布时间: 2011-06-10

高手说,如果关系到多个语句的查询结果,要用事务。

作者: chuanzhang5687   发布时间: 2011-06-10

沙发 。。

作者: sekai2011   发布时间: 2011-06-10


我只需要查询出这样的就可以了.
或者用别的方法也行.

作者: chirea   发布时间: 2011-06-10

12是怎么来的

作者: chuanzhang5687   发布时间: 2011-06-10

看了上面的设计,有点想法不知道对不对:
不同部门对应的奖项个数是不一致的,
但结果又不列出所有部门对应的所有奖项(只列出本部门对应的奖项),
但所有部门的结果集要求放在一起显示,这样应该无法实现

作者: cd731107   发布时间: 2011-06-10

引用 5 楼 cd731107 的回复:
看了上面的设计,有点想法不知道对不对:
不同部门对应的奖项个数是不一致的,
但结果又不列出所有部门对应的所有奖项(只列出本部门对应的奖项),
但所有部门的结果集要求放在一起显示,这样应该无法实现

豆子好,好久没见到你了

但结果又不列出所有部门对应的所有奖项(只列出本部门对应的奖项),是的就是要做到这一点


但所有部门的结果集要求放在一起显示,这样应该无法实现--如果这点不能实现没事,我就分别显示部门就可以了.查找相应的部门显示相应的奖项.

作者: chirea   发布时间: 2011-06-10

哈哈 帮楼主写了个参考下

SQL code

SELECT  员工编号,部门名称,MAX(CASE WHEN [奖项名称]='质量奖' THEN 金额 END ) AS  质量奖,
MAX(CASE WHEN [奖项名称]='安全奖' THEN 金额 END)   AS  安全奖 
FROM   (SELECT c.员工编号,a.部门名称,a.奖项名称 ,a.金额 FROM  #奖项表 a,#部门表  b,#员工表  c 
WHERE a.部门名称=b.部门名称  AND  b.部门ID=c.所属部门 ) a
GROUP BY 员工编号, 部门名称

/*

员工编号    部门名称    质量奖    安全奖
001    A    11    13
002    A    11    13
*/


作者: sekai2011   发布时间: 2011-06-10

SQL code
select a.员工编号,b.部门名称,max(case c.奖项名称 when '质量奖' then 金额 end) as 质量奖,
max(case c.奖项名称 when '安全奖' then 金额 end) 安全奖 ,
 from   #员工表 a , #部门表 b  , #奖项表 c where
 a.所属部门=b.部门ID and  b.部门名称 =c.部门名称 group by a.员工编号,b.部门名称

作者: chuanzhang5687   发布时间: 2011-06-10

SQL code
鸭子,被人先弄出来了。哎

作者: chuanzhang5687   发布时间: 2011-06-10

引用 7 楼 sekai2011 的回复:
哈哈 帮楼主写了个参考下


SQL code

SELECT 员工编号,部门名称,MAX(CASE WHEN [奖项名称]='质量奖' THEN 金额 END ) AS 质量奖,
MAX(CASE WHEN [奖项名称]='安全奖' THEN 金额 END) AS 安全奖
FROM (SELECT c.员工编号,a.部门名称,a.奖项名称 ,a.金额 FROM #……

有点不明白为啥要用MAX?

作者: chirea   发布时间: 2011-06-10



就是做个分组了,看情况用sum也可以啊 
其实就是个行转列的应用 。。。
好奇一下 楼主是MM吗?

附动态sql :

SQL code



DECLARE @s VARCHAR(2000)
SET @s = 'SELECT  员工编号,部门名称'
SELECT  @s = @s + ',MAX(CASE WHEN [奖项名称]=''' + 奖项名称 + ''' then 金额 end ) as  '
        + 奖项名称
FROM    ( SELECT DISTINCT
                    a.奖项名称
          FROM      #奖项表 a,
                    #部门表 b,
                    #员工表 c
          WHERE     a.部门名称 = b.部门名称
                    AND b.部门ID = c.所属部门
        ) a 

SET @s = @s
    + ' FROM   (SELECT c.员工编号,a.部门名称,a.奖项名称 ,a.金额 FROM  #奖项表 a,#部门表  b,#员工表  c 
WHERE a.部门名称=b.部门名称  AND  b.部门ID=c.所属部门 ) a
GROUP BY 员工编号, 部门名称 '

PRINT ( @s )
EXEC (@s)
 
 
 /*
 员工编号    部门名称    安全奖    质量奖
001    A    13    11
002    A    13    11
 */






作者: sekai2011   发布时间: 2011-06-10

SQL code
group by a.员工编号,b.部门名称
已经按分组排序了,为了避免重复,
你可以参考一下这个
SQL code

select a.员工编号,b.部门名称,(case c.奖项名称 when '质量奖' then 金额 end) as 质量奖,
(case c.奖项名称 when '安全奖' then 金额 end) 安全奖 
 from   #员工表 a , #部门表 b  , #奖项表 c where
 a.所属部门=b.部门ID and  b.部门名称 =c.部门名称
引用 10 楼 chirea 的回复:
引用 7 楼 sekai2011 的回复:
哈哈 帮楼主写了个参考下


SQL code

SELECT 员工编号,部门名称,MAX(CASE WHEN [奖项名称]='质量奖' THEN 金额 END ) AS 质量奖,
MAX(CASE WHEN [奖项名称]='安全奖' THEN 金额 END) AS 安全奖
FROM (SELECT c.员工编号,a.部门名称,a.奖项名……

作者: chuanzhang5687   发布时间: 2011-06-10

你那个C,A字段估计得先列值拆分。然后在行列转换

作者: chuanzhang5687   发布时间: 2011-06-10

引用 12 楼 chuanzhang5687 的回复:
SQL code
group by a.员工编号,b.部门名称
已经按分组排序了,为了避免重复,
你可以参考一下这个

SQL code

select a.员工编号,b.部门名称,(case c.奖项名称 when '质量奖' then 金额 end) as 质量奖,
(case c.奖项名称 when '安全奖' then 金额 end) 安全奖
from #员工表 ……

谢谢.你这种讲我明白很多...

作者: chirea   发布时间: 2011-06-10