动态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
作者: chuanzhang5687 发布时间: 2011-06-10
不同部门对应的奖项个数是不一致的,
但结果又不列出所有部门对应的所有奖项(只列出本部门对应的奖项),
但所有部门的结果集要求放在一起显示,这样应该无法实现
作者: cd731107 发布时间: 2011-06-10
看了上面的设计,有点想法不知道对不对:
不同部门对应的奖项个数是不一致的,
但结果又不列出所有部门对应的所有奖项(只列出本部门对应的奖项),
但所有部门的结果集要求放在一起显示,这样应该无法实现
豆子好,好久没见到你了
但结果又不列出所有部门对应的所有奖项(只列出本部门对应的奖项),是的就是要做到这一点
但所有部门的结果集要求放在一起显示,这样应该无法实现--如果这点不能实现没事,我就分别显示部门就可以了.查找相应的部门显示相应的奖项.
作者: 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
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
鸭子,被人先弄出来了。哎
作者: chuanzhang5687 发布时间: 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 #……
有点不明白为啥要用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
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.部门名称
引用 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
作者: chuanzhang5687 发布时间: 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 #员工表 ……
谢谢.你这种讲我明白很多...
作者: chirea 发布时间: 2011-06-10