SQL行列转换

breezewj 2008-06-13 05:55:16

数据库里查出的结果(select 项目,值 from test)
项目, 值, 位置
项目1, 15,1
项目1, 34,2
项目1, 56,3
项目1, 42,4
项目2, 56,1
项目2, 67,2
项目2, 31,3
项目2, 89,4
项目3,45,1
项目3,22,2
项目3,8,3
项目3,23,4

我想得到这样的结果

项目1 项目2 C项目3 位置
15 56 45 1
34 67 22 2
56 31 8 3
42 89 23 4

请问SQL语句该怎么写,谢谢~~
...全文
8695 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanpengyu 2012-10-16
  • 打赏
  • 举报
回复
select * from project

select position, project1, project2, project3
from project
pivot
(sum(value) for project in (project1, project2, project3)) pvt


project1 15 1
project1 34 2
project1 56 3
project1 42 4
project2 56 1
project2 67 2
project2 31 3
project2 89 4
project3 45 1
project3 22 2
project3 8 3
project3 23 4


1 15 56 45
2 34 67 22
3 56 31 8
4 42 89 23
wacad98 2012-09-04
  • 打赏
  • 举报
回复
SQL code--> --> (Roy)生成測試數據

set nocount on;
if not object_id('Tempdb..#T') is null
drop table #T
Go
set nocount on;
Create table #T([项目] nvarchar(3),[值] int,[位置] int)
Insert #T
select N'项目1',15,1 union all
select N'项目1',34,2 union all
select N'项目1',56,3 union all
select N'项目1',42,4 union all
select N'项目2',56,1 union all
select N'项目2',67,2 union all
select N'项目2',31,3 union all
select N'项目2',89,4 union all
select N'项目3',45,1 union all
select N'项目3',22,2 union all
select N'项目3',8,3 union all
select N'项目3',23,4
Go
declare @s nvarchar(1000)
select @s=isnull(@s+',','')+quotename([项目]) from #T group by [项目]
exec('select '+@s+',[位置] from #T pivot (max([值]) for [项目] in('+@s+'))b')


项目1 项目2 项目3 位置
----------- ----------- ----------- -----------
15 56 45 1
34 67 22 2
56 31 8 3
42 89 23 4
cheng1234xiang 2012-02-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 breezewj 的回复:]
数据库里查出的结果(select 项目,值 from test)
项目, 值, 位置
项目1, 15,1
项目1, 34,2
项目1, 56,3
项目1, 42,4
项目2, 56,1
项目2, 67,2
项目2, 31,3
项目2, 89,4
项目3,45,1
项目3,22,2
项目3,8,3
项目3,23,4

我想得到这样的结果

项目1 项目2 ……
[/Quote]


个人个人过热锅
youzelin 2011-09-19
  • 打赏
  • 举报
回复

// 如果您是 SQL Server 2008 版本,请使用以下代码,
// 代码经过测试,且并非网上拽取。
// 这个 SQL 是第一个要求,第二个要求只要将最外层的 SELECT 改成 SELECT * 即可。
SELECT classid,
MAX(CASE Rn
WHEN 1 THEN amount
ELSE 0
END) AS sku1,
MAX(CASE Rn
WHEN 2 THEN amount
ELSE 0
END) AS sku2
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY classid ORDER BY amount DESC) AS Rn,
orderid,
classid,
sku,
amount
FROM dbo.TestTB2
) a
WHERE a.Rn < 3
GROUP BY a.classid
delphilrj 2011-09-05
  • 打赏
  • 举报
回复
xuexile
邹伯通_AI智造 2011-04-09
  • 打赏
  • 举报
回复
看看这篇:《SQL行列转换:报表_公司采购表_每个公司各采购了些什么产品》http://www.cnblogs.com/jameszou/archive/2011/04/08/2009543.html
虾米 2010-08-28
  • 打赏
  • 举报
回复
怎么会是无满意结贴呢?
haa17 2010-06-09
  • 打赏
  • 举报
回复
马克 马克
nanyida0416sushe 2010-04-13
  • 打赏
  • 举报
回复
sql真的是博大精深啊!学习了!
adlin1225 2009-08-20
  • 打赏
  • 举报
回复
学习学习
yooyoozoo 2009-03-14
  • 打赏
  • 举报
回复
mark了 ~!~ 记下在学习
yuangang1011 2009-01-05
  • 打赏
  • 举报
回复
学习
worlddba 2009-01-04
  • 打赏
  • 举报
回复
学习了
JYR520 2008-09-02
  • 打赏
  • 举报
回复
交叉表的实现应该挺复杂的,最近正头疼呢,不知该怎么写??
duanchang_ren 2008-09-01
  • 打赏
  • 举报
回复
ftjb p tc ddpd kb
tangyong12 2008-08-25
  • 打赏
  • 举报
回复
用在子查询中不行吗?
我有这么一个存储过程,每次查出来的都只是最后一条纪录:

ALTER procedure dbo.test
as
declare @sql varchar(1000)
select @sql = isnull(@sql +',','')+ '['+tjlb+']= max(case when tjlb = '''+tjlb+''' then sjhs else 0 end)'
from
(
select e.name as tjlb
from t_m_zy0100 a
left join t_m_zy0301 b on a.zyid = b.zyid
left join t_m_zy0302 c on b.fyjlh = c.fyjlh
left join t_b_fydm d on c.fyid = d.id
left join t_b_fylbdm e on d.zytjlb = e.code
where a.brysid = -1
group by e.name
) t
exec('select ' + @sql +' from (
select a.xm,a.zyh,e.name as tjlb,sum(c.sjhs) as sjhs
from t_m_zy0100 a
left join t_m_zy0301 b on a.zyid = b.zyid
left join t_m_zy0302 c on b.fyjlh = c.fyjlh
left join t_b_fydm d on c.fyid = d.id
left join t_b_fylbdm e on d.zytjlb = e.code
where a.brysid = -1
group by a.xm,a.zyh,e.name) t1 group by t1.xm,t1.zyh')
w3k 2008-08-03
  • 打赏
  • 举报
回复
mark
xuance 2008-08-01
  • 打赏
  • 举报
回复
mark
SQLnewlearner 2008-06-17
  • 打赏
  • 举报
回复
看来用动态SQL的很多。
breezewj 2008-06-16
  • 打赏
  • 举报
回复
非常感谢~`
加载更多回复(8)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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