SQL查询语句混排的问题

godmouser 2009-05-31 09:12:43
表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
现在要如何把查询的结果显示成:
序号 单号 部门
采购课 工程一部 工程二部
1 C-20090013 414-200905,222-200301
2 C-20090012 047-200504
3 C-20090016 427-200303
9 C-20090014 222-200301
4 C-20090015 427-200303 981-200801
请问应该如何实现上面的功能呢?谢谢!
...全文
117 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
claro 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 godmouser 的回复:]
还有一个就是部门可能会有很多,大概有十五个左右,可以让结果只显示列出来的部门吗?比如示例数据中没有研发部,就可以不显示出来
[/Quote]可以,在select XXX from ,XXX中按需输入。借用8楼脚本
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 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 godmouser 的回复:]
哈哈,不好意思,最后的那个SH001是自增列,只是最后一个我忘记改了!实在不好意思!
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,似乎不支持啊

还有一个就是部门可能…
[/Quote]建议楼主看看数据行列转换和合并拆分案例;CSDN中此案例非常多。
行列转换
合并拆分
godmouser 2009-05-31
  • 打赏
  • 举报
回复
哈哈,不好意思,最后的那个SH001是自增列,只是最后一个我忘记改了!实在不好意思!
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,似乎不支持啊

还有一个就是部门可能会有很多,大概有十五个左右,可以让结果只显示列出来的部门吗?比如示例数据中没有研发部,就可以不显示出来

claro 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 godmouser 的回复:]
顺便问一下,为什么格式对好后,提交后显示出来会全部乱掉呀?
[/Quote]是会乱,论坛都是这样。
看图吧
claro 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 godmouser 的回复:]
说明:序号是查询有时候显示出来的一列,相当于第几行的一个编号,也可以不要此列!

请问应该如何实现上面的功能呢?谢谢!
[/Quote]要不要序号都无所谓了,楼主给的序号看起来不像是自增列。
/*--参考
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
*/
*/
JonasFeng 2009-05-31
  • 打赏
  • 举报
回复
 

IF OBJECT_ID('LI') IS NOT NULL
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
*/
godmouser 2009-05-31
  • 打赏
  • 举报
回复
顺便问一下,为什么格式对好后,提交后显示出来会全部乱掉呀?


godmouser 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 claro 的回复:]
引用 1 楼 godmouser 的回复:
有没有人帮忙一下呀,这样的结果可以实现吗?先谢谢了!
楼主给的数据有问题?
SH001字段没有4,结果哪来的4呢?
[/Quote]

不好意思,我描述有问题。
表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
说明:序号是查询有时候显示出来的一列,相当于第几行的一个编号,也可以不要此列!

请问应该如何实现上面的功能呢?谢谢!

godmouser 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 claro 的回复:]
案例
[/Quote]
谢谢回复,我已看过你的案例,但是我要的是如果同一单号,SH003列有相同话,那么SH004的值是相加的,不是统计或显示出来。
也就是说原表可能有七行,但查询出来后,会处理相同单号(SH002)的数据,并合并SH004列的值,这样显示出来可能就只有五行或更少
claro 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 godmouser 的回复:]
有没有人帮忙一下呀,这样的结果可以实现吗?先谢谢了!
[/Quote]楼主给的数据有问题?
SH001字段没有4,结果哪来的4呢?
ks_reny 2009-05-31
  • 打赏
  • 举报
回复
行列互换
claro 2009-05-31
  • 打赏
  • 举报
回复
godmouser 2009-05-31
  • 打赏
  • 举报
回复
有没有人帮忙一下呀,这样的结果可以实现吗?先谢谢了!
godmouser 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 claro 的回复:]
引用 11 楼 godmouser 的回复:
还有一个就是部门可能会有很多,大概有十五个左右,可以让结果只显示列出来的部门吗?比如示例数据中没有研发部,就可以不显示出来
可以,在select XXX from ,XXX中按需输入。借用8楼脚本
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 …
[/Quote]
要这样删除的话,就太不灵活了啊,示例基本上都是针对2005的
非常感谢claro

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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