SQL行转列的问题!

bluenight911 2007-04-27 07:03:26
用语句
select a.SN,a.Process_id,b.Data_id,b.MeasureData from cr_test a left join cr_data b on a.test_id = b.test_id order by a.sn,b.data_id,a.process_id
得到记录如下
sn process_id data_id measuredata
12770006 1 1 1.34
12770006 1 2 0.46
12770006 1 3 9.82
14061916 2 1 5.5
14061916 2 2 4.36
12770006 2 1 6.43
12770006 2 2 0.12
12770006 2 3 6.73
14061916 3 1 3.4
14061916 3 2 1.1

但是这不符合客户的要求,他们的要求是
sn process_id field1 field2 field3 field4
12770006 1 1.34 0.46 9.82 Null
14061916 2 5.5 4.36 Null Null
12770006 2 6.43 0.12 6.73 Null
14061916 3 3.4 1.1 Null Null

就是在原来查询记录的基础上,把measuredata按照data_id的顺序横向排列,但是需要注意的是不同的sn可能measuredata的数目不同.如12770006有3个,14061916只有2个,因此在field3,fiels4处置为Null.但最长到field4.

不知我表达清楚没有,如能解决高分相送,分有的是---------关键是项目催的紧!!!!

请给出具体的sql语句,谢谢!
...全文
1666 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenny_appleso 2007-04-29
  • 打赏
  • 举报
回复
leo_lesley(leo)正解
bnjbl 2007-04-29
  • 打赏
  • 举报
回复
汗 好多句看都看不懂
qq6649 2007-04-28
  • 打赏
  • 举报
回复
楼上又一牛人
cool_roc 2007-04-28
  • 打赏
  • 举报
回复
上面有几个写得挺好的啊,为什么不给分呢?
wuhuiITren 2007-04-28
  • 打赏
  • 举报
回复
留名
xtra6714 2007-04-28
  • 打赏
  • 举报
回复
leo_lesley(leo) ,高手!
qidou71 2007-04-28
  • 打赏
  • 举报
回复
同意sxycgxj(云中客)
wxh163000 2007-04-28
  • 打赏
  • 举报
回复
同意sxycgxj(云中客)的
zhang030219 2007-04-28
  • 打赏
  • 举报
回复
相当牛啊,学习
leo_lesley 2007-04-27
  • 打赏
  • 举报
回复

CREATE TABLE tb(sn varchar(20),process_id int,data_id int,measuredata numeric(9,2))
INSERT tb SELECT '12770006',1,1,1.34
UNION ALL SELECT '12770006',1,2,046
UNION ALL SELECT '12770006',1,3,9.82
UNION ALL SELECT '14061916',2,1,5.5
UNION ALL SELECT '14061916',2,2,4.36
UNION ALL SELECT '12770006',2,1,6.43
UNION ALL SELECT '12770006',2,2,0.12
UNION ALL SELECT '12770006',2,3,6.37
UNION ALL SELECT '14061916',3,1,3.4
UNION ALL SELECT '14061916',3,2,1.1

--查询处理
DECLARE @s nvarchar(4000)
--交叉报表处理代码头
SET @s='SELECT sn,process_id'
--生成列记录水平显示的处理代码拼接(处理Item列)
SELECT @s=@s
+','+QUOTENAME(data_id)
+N'=SUM(CASE data_id WHEN '+QUOTENAME(data_id,N'''')
+N' THEN measuredata END)'
FROM tb
GROUP BY data_id

--拼接交叉报表处理尾部,并且执行拼接后的动态SQL语句
EXEC(@s+N'
FROM tb
GROUP BY sn,process_id')
bluenight911 2007-04-27
  • 打赏
  • 举报
回复
select a.SN,a.Process_id,b.Data_id,b.MeasureData from cr_test a left join cr_data b on a.test_id = b.test_id order by a.sn,b.data_id,a.process_id
这个语句其实只是一个示例,其中还牵扯到很多表.因此我打算不改变原来的语句.而在原来语句查询结果的基础上再进行一次处理请问应该怎么解决???
云中客 2007-04-27
  • 打赏
  • 举报
回复
楼主的格式如果要求是固定的,而非是动态的,我想完全可以直接用一条语句来实现

---涛声依旧--- 2007-04-27
  • 打赏
  • 举报
回复
同意sxycgxj(云中客)的
zlp321002 2007-04-27
  • 打赏
  • 举报
回复
declare @s varchar(2000)
set @s='select ta.sn,ta.process_id'
select @s=@s+',field'+ltrim(tb.data_id)+'=sum(case when tb.data_id='''+ltrim(tb.data_id)+''' then tb.measuredata else 0 end)'
from (select top 100 percent a.SN,a.Process_id,b.Data_id,b.MeasureData from cr_test a left join cr_data b on a.test_id = b.test_id order by a.sn,b.data_id,a.process_id) tb
group by tb.data_id
set @s=@s+' from (select a.SN,a.Process_id,b.Data_id,b.MeasureData from cr_test a left join cr_data b on a.test_id = b.test_id order by a.sn,b.data_id,a.process_id) ta group by ta.sn,ta.process_id'
exec(@s)
云中客 2007-04-27
  • 打赏
  • 举报
回复
不好意思,这里写错了:
Group By a.SN,a.Process_id,
order by a.sn,b.data_id
---------------------------
Group By a.SN,a.Process_id
order by a.SN,a.Process_id
云中客 2007-04-27
  • 打赏
  • 举报
回复
Select a.SN,a.Process_id,
[field1]=max(case when b.data_id=1 then b.measuredata end),
[field2]=max(case when b.data_id=2 then b.measuredata end),
[field3]=max(case when b.data_id=3 then b.measuredata end),
[field4]=max(case when b.data_id=4 then b.measuredata end)
From cr_test a
left join cr_data b on a.test_id = b.test_id
Group By a.SN,a.Process_id,
order by a.sn,b.data_id

bqliao 2007-04-27
  • 打赏
  • 举报
回复
Declare @cols nvarchar(max);

WITH CTECourse(Course)
As
(
Select Distinct Course From table1
)

Select @cols = IsNull(@cols + ',[','[') + Course + ']' From CTECourse

DECLARE @sql AS nvarchar(MAX)
SET @sql = N'SELECT *
FROM (SELECT [Name], [Course], [Grade]
FROM table1) as Header
PIVOT(SUM([Grade]) FOR [Course] IN(' + @cols + N')) AS Piv'
PRINT @sql -- for debugging
EXEC sp_executesql @sql
bqliao 2007-04-27
  • 打赏
  • 举报
回复
SQL 2005 PIVOT
远方1609 2007-04-27
  • 打赏
  • 举报
回复
case........when

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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