谢谢回复,我已看过你的案例,但是我要的是如果同一单号,SH003列有相同话,那么SH004的值是相加的,不是统计或显示出来。
也就是说原表可能有七行,但查询出来后,会处理相同单号(SH002)的数据,并合并SH004列的值,这样显示出来可能就只有五行或更少
也就是说原表可能有七行,但查询出来后,会处理相同单号(SH002)的数据,并合并SH004列的值,这样显示出来可能就只有五行或更少
解决方案 »
- SQL server 不停的占用内存??
- SQL 2005当作业失败时,如何发送MAIL通知?
- 请大家看一下这个view怎么写
- 请问正在使用运行中的生产数据库可以做备份吗?
- myql事件调度问题 急!!! O(∩_∩)O谢谢
- SQL中click字段定义为smallint,记录到32767条记录后,出错如下,怎么解决?
- 求助,关于reinstall SQL Server + Reporting server
- Reporting Service 出错
- 同步后, 对表操作时出现: The updatelineage function requires 2 arguments. ( 顶也有分!)
- 关于SQL语句执行效率问题
- 一个sql查询问题
- 进销存很难的SQL语句
不好意思,我描述有问题。
表A的记录如下:
SH001 SH002 SH003 SH004
1 C-20090013 采购课 414-200905
2 C-20090012 采购课 047-200504
3 C-20090016 工程一部 427-200303
5 C-20090015 工程一部 427-200303
7 C-20090013 采购课 222-200301
9 C-20090014 采购课 222-200301
5 C-20090015 工程二部 981-200801
说明:SH001为流水号(自增的标识符)
现在要如何把查询的结果显示成:
序号 单号 部门
采购课 工程一部 工程二部
1 C-20090013 414-200905,222-200301
2 C-20090012 047-200504
3 C-20090016 427-200303
4 C-20090014 222-200301
5 C-20090015 427-200303 981-200801
说明:序号是查询有时候显示出来的一列,相当于第几行的一个编号,也可以不要此列!请问应该如何实现上面的功能呢?谢谢!
DROP TABLE LI CREATE TABLE LI (SH001 INT ,SH002 VARCHAR(20),SH003 VARCHAR(20),SH004 VARCHAR(20))
INSERT INTO LI (SH001,SH002,SH003,SH004)
SELECT 1, 'C-20090013', '采购课', '414-200905' UNION ALL
SELECT 2, 'C-20090012', '采购课', '047-200504' UNION ALL
SELECT 3, 'C-20090016', '工程一部 ', '427-200303' UNION ALL
SELECT 5, 'C-20090015', '工程一部', '427-200303' UNION ALL
SELECT 1, 'C-20090013', '采购课', '222-200301' UNION ALL
SELECT 9, 'C-20090014', '采购课', '222-200301' UNION ALL
SELECT 5, 'C-20090015', '工程二部', '981-200801'
--查询结果
SELECT SH001,SH002,
MAX(CASE SH003 WHEN '采购课' THEN ISNULL(SH004,'') ELSE '' END) AS 采购课,
MAX(CASE SH003 WHEN '工程一部' THEN ISNULL(SH004,'') ELSE '' END) AS 工程一部,
MAX(CASE SH003 WHEN '工程二部' THEN ISNULL(SH004,'') ELSE '' END) AS 工程一部
FROM LI
GROUP BY SH001,SH002
ORDER BY SH001,SH002
/* 结果
SH001 SH002 采购课 工程一部 工程二部
2 C-20090012 047-200504
1 C-20090013 414-200905
9 C-20090014 222-200301
5 C-20090015 427-200303 981-200801
3 C-20090016 427-200303
*/
/*--参考
CREATE TABLE #A (SH001 INT,SH002 VARCHAR(20),SH003 VARCHAR(80),SH004 VARCHAR(20))
INSERT INTO #A
SELECT 1,'C-20090013','采购课','414-200905' UNION ALL
SELECT 2,'C-20090012','采购课','047-200504' UNION ALL
SELECT 3,'C-20090016','工程一部','427-200303' UNION ALL
SELECT 5,'C-20090015','工程一部','427-200303' UNION ALL
SELECT 7,'C-20090013','采购课','222-200301' UNION ALL
SELECT 9,'C-20090014','采购课','222-200301' UNION ALL
SELECT 5,'C-20090015','工程二部','981-200801'
/*
SH001 SH002 采购课 工程一部 工程二部
2 C-20090012 047-200504
1 C-20090013 414-200905
7 C-20090013 222-200301
9 C-20090014 222-200301
5 C-20090015 427-200303 981-200801
3 C-20090016 427-200303
*/
;with CTE as (
Select SH001,SH002,ISNULL(采购课,'') 采购课,ISNULL(工程一部,'') 工程一部,ISNULL(工程二部,'') 工程二部
from (Select SH001,SH002,SH003,SH004 from #A ) a pivot (max(SH004) for SH003
in (采购课,工程一部,工程二部)) b
)SELECT MIN(SH001) SH001,SH002
,[采购课]=STUFF((SELECT ','+采购课 FROM CTE WHERE SH002=c.SH002 FOR XML PATH('')), 1, 1, '')
,MAX(工程一部) [工程一部]
,MAX(工程二部) [工程二部]
FROM CTE c
GROUP BY SH002
/*
SH001 SH002 采购课 工程一部 工程二部
2 C-20090012 047-200504
1 C-20090013 414-200905,222-200301
9 C-20090014 222-200301
5 C-20090015 427-200303 981-200801
3 C-20090016 427-200303
*/
*/
with CTE as (
Select SH001,SH002,ISNULL(采购课,'') 采购课,ISNULL(工程一部,'') 工程一部,ISNULL(工程二部,'') 工程二部
from (Select SH001,SH002,SH003,SH004 from #A ) a pivot (max(SH004) for SH003
in (采购课,工程一部,工程二部)) b
)
这个是哪个版本的呢?我现在用的是SQL Server 2000,似乎不支持啊还有一个就是部门可能会有很多,大概有十五个左右,可以让结果只显示列出来的部门吗?比如示例数据中没有研发部,就可以不显示出来
行列转换
合并拆分
SELECT SH001,SH002,
MAX(CASE SH003 WHEN '采购课' THEN ISNULL(SH004,'') ELSE '' END) AS 采购课,
MAX(CASE SH003 WHEN '工程一部' THEN ISNULL(SH004,'') ELSE '' END) AS 工程一部,
MAX(CASE SH003 WHEN '研发部' THEN ISNULL(SH004,'') ELSE '' END) AS 研发部
不要研发部可以删掉此行。
非常感谢claro