varchar的值行转列问题

wulg10 2011-01-28 02:59:51

SELECT s.dataD_name AS 节次, a.arrangement_week, a.arrangement_grade, a.arrangement_dept_id,
isnull(max(CASE a.arrangement_day WHEN '1' THEN b.course_name + ' (' + t .teacher_name + ')' ELSE '-' END),'') AS Mon,
isnull(max(CASE a.arrangement_day WHEN '2' THEN b.course_name + ' (' + t .teacher_name + ')' ELSE '-' END),'') AS Tue,
isnull(max(CASE a.arrangement_day WHEN '3' THEN b.course_name + ' (' + t .teacher_name + ')' ELSE '-' END),'') AS Wed,
isnull(max(CASE a.arrangement_day WHEN '4' THEN b.course_name + ' (' + t .teacher_name + ')' ELSE '-' END),'') AS Thu,
isnull(max(CASE a.arrangement_day WHEN '5' THEN b.course_name + ' (' + t .teacher_name + ')' ELSE '-' END),'') AS Fri,
isnull(max(CASE a.arrangement_day WHEN '6' THEN b.course_name + ' (' + t .teacher_name + ')' ELSE '-' END),'') AS Sat,
isnull(max(CASE a.arrangement_day WHEN '7' THEN b.course_name + ' (' + t .teacher_name + ')' ELSE '-' END),'') AS Sun, a.arrangement_course_type
FROM dbo.d_arrangement AS a RIGHT JOIN
dbo.s_dataD AS s ON s.dataD_id >= a.arrangement_festival_start_dataD_id AND
s.dataD_id <= a.arrangement_festival_end_dataD_id LEFT JOIN
dbo.b_course AS b ON b.course_id = a.arrangement_course_id LEFT JOIN
dbo.b_teacher AS t ON a.arrangement_teacher_id = t.teacher_id left join b_dept dept on dept.dept_id=a.arrangement_dept_id
WHERE (s.dataD_kind = 7) AND (s.dataD_id <> 700) and a.arrangement_dept_id=2
GROUP BY s.dataD_name, a.arrangement_day, a.arrangement_festival_start_dataD_id, a.arrangement_course_id, b.course_name, t.teacher_name, s.dataD_id,
a.arrangement_week, a.arrangement_grade, a.arrangement_dept_id, a.arrangement_course_type


结果如下:

节次 grade Mon Tue Wed Thu Fri
------- ------ ------------ ------------ ------------- -------------- ------
第一节 2011 test (xx老师) - - - -
第二节 2011 test (xx老师) - - - -
第三节 2011 - test (xx老师) - - -
第四节 2011 - test (xx老师) - - -
第五节 2011 test (xx老师) - - - -
第六节 2011 test (xx老师) - - - -
晚间 2011 - test (xx老师) - - -
晚间 2011 - - test (xx老师) - -
晚间 2011 - - - test (xx老师) -


晚间的值没有合并在一起。网上行转列都是转的数字型,所以用isNull(sum(..),0)就行了。但是我转换的是varchar。请问有怎么查询让条件符合的值合并
...全文
232 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wulg10 2011-01-30
  • 打赏
  • 举报
回复
本来还想看看其他人的思路,没人就结了
AcHerat 2011-01-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wulg10 的回复:]
过年都没人气了。
[/Quote]

都记着回家,这帖OK呢?那就结了吧!分就当发红包了。
wulg10 2011-01-30
  • 打赏
  • 举报
回复
过年都没人气了。
xuam 2011-01-28
  • 打赏
  • 举报
回复
GROUP BY s.dataD_name, s.dataD_id


wulg10 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wxf163 的回复:]

SELECT [节次],[grade],max([Mon]),max([Tue]),max([Wed] ),max([Thu] ),max([Fri])
FROM [TB]
group by [节次],[grade]
[/Quote]

试了下,成功了。
wulg10 2011-01-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 acherat 的回复:]

SQL code

SELECT s.dataD_name AS 节次, a.arrangement_week, a.arrangement_grade, a.arrangement_dept_id,
isnull(max(CASE a.arrangement_day WHEN '1' THEN max(b.course_name) + ' (' ……
[/Quote]

你这直接加上2个max(),sql报错---不能对包含聚合或子查询的表达式执行聚合函数。
王向飞 2011-01-28
  • 打赏
  • 举报
回复
SELECT [节次],[grade],max([Mon]),max([Tue]),max([Wed] ),max([Thu] ),max([Fri])
FROM [TB]
group by [节次],[grade]
AcHerat 2011-01-28
  • 打赏
  • 举报
回复

SELECT s.dataD_name AS 节次, a.arrangement_week, a.arrangement_grade, a.arrangement_dept_id,
isnull(max(CASE a.arrangement_day WHEN '1' THEN max(b.course_name) + ' (' + max(t .teacher_name) + ')' ELSE '-' END),'') AS Mon,
isnull(max(CASE a.arrangement_day WHEN '2' THEN max(b.course_name) + ' (' + max(t .teacher_name) + ')' ELSE '-' END),'') AS Tue,
isnull(max(CASE a.arrangement_day WHEN '3' THEN max(b.course_name) + ' (' + max(t .teacher_name) + ')' ELSE '-' END),'') AS Wed,
isnull(max(CASE a.arrangement_day WHEN '4' THEN max(b.course_name) + ' (' + max(t .teacher_name) + ')' ELSE '-' END),'') AS Thu,
isnull(max(CASE a.arrangement_day WHEN '5' THEN max(b.course_name) + ' (' + max(t .teacher_name) + ')' ELSE '-' END),'') AS Fri,
isnull(max(CASE a.arrangement_day WHEN '6' THEN max(b.course_name) + ' (' + max(t .teacher_name) + ')' ELSE '-' END),'') AS Sat,
isnull(max(CASE a.arrangement_day WHEN '7' THEN max(b.course_name) + ' (' + max(t .teacher_name) + ')' ELSE '-' END),'') AS Sun, a.arrangement_course_type
FROM dbo.d_arrangement AS a RIGHT JOIN
dbo.s_dataD AS s ON s.dataD_id >= a.arrangement_festival_start_dataD_id AND
s.dataD_id <= a.arrangement_festival_end_dataD_id LEFT JOIN
dbo.b_course AS b ON b.course_id = a.arrangement_course_id LEFT JOIN
dbo.b_teacher AS t ON a.arrangement_teacher_id = t.teacher_id left join b_dept dept on dept.dept_id=a.arrangement_dept_id
WHERE (s.dataD_kind = 7) AND (s.dataD_id <> 700) and a.arrangement_dept_id=2
GROUP BY s.dataD_name, a.arrangement_day, a.arrangement_festival_start_dataD_id, a.arrangement_course_id, b.course_name, t.teacher_name, s.dataD_id,
a.arrangement_week, a.arrangement_grade, a.arrangement_dept_id, a.arrangement_course_type
wulg10 2011-01-28
  • 打赏
  • 举报
回复
前面数据我写错。

节次 grade Mon Tue Wed Thu Fri
------- ------ ------------ ------------ ------------- -------------- ------
晚间 2011 - test (xx老师) - - -
晚间 2011 - - test (xx老师) - -
晚间 2011 - - - test (xx老师) -


转变成以下

节次 grade Mon Tue Wed Thu Fri
------- ------ ------------ ------------ ------------- -------------- ------
晚间 2011 - test (xx老师) test (xx老师) test (xx老师) - -
王向飞 2011-01-28
  • 打赏
  • 举报
回复
怎么出来了个晚间?。。。
xuam 2011-01-28
  • 打赏
  • 举报
回复
是你的基础数据本身有问题吧?
[Quote=引用 4 楼 wulg10 的回复:]
SQL code

节次 grade Mon Tue Wed Thu Fri
------- ------ ------------ ------------ ------------- -------------- ------
第一节 ……
[/Quote]
wulg10 2011-01-28
  • 打赏
  • 举报
回复

节次 grade Mon Tue Wed Thu Fri
------- ------ ------------ ------------ ------------- -------------- ------
第一节 2011 test (xx老师) - - - -
第二节 2011 test (xx老师) - - - -
第三节 2011 - test (xx老师) - - -
第四节 2011 - test (xx老师) - - -
第五节 2011 test (xx老师) - - - -
第六节 2011 test (xx老师) test (xx老师) test (xx老师) test (xx老师) - - -


要的是这效果
王向飞 2011-01-28
  • 打赏
  • 举报
回复
数值型可以用sum合并,你字符串想怎么合并?不还是用,号加一起吗?如果是:参考一楼

如果不是,你要怎么合并?
wulg10 2011-01-28
  • 打赏
  • 举报
回复
ls的不是我要的结果,我是行转列时,晚间的记录没有整合到一起。网上的例子都是用int型来行转列的。我这是varchar,所有行转列时没有把一条数据整合在一起的时候失败了
王向飞 2011-01-28
  • 打赏
  • 举报
回复
/*
标题:按某字段合并字符串之一(简单合并)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-06
地点:广东深圳

描述:将如下形式的数据按id字段合并value字段。
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id value
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)
*/
--1、sql2000中只能用自定义的函数解决
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

create function dbo.f_str(@id int) returns varchar(100)
as
begin
declare @str varchar(1000)
set @str = ''
select @str = @str + ',' + cast(value as varchar) from tb where id = @id
set @str = right(@str , len(@str) - 1)
return @str
end
go

--调用函数
select id , value = dbo.f_str(id) from tb group by id

drop function dbo.f_str
drop table tb

22,207

社区成员

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

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