请问一条sql语句的写法,在线等

xiaozi161 2014-04-12 10:59:07
比如我的3张表goods,place,main 数据分别如下:
goods表
id name
1 黄沙
2 水泥
3 玻璃

place表
id name
1 北京
2 天津
3 上海

main表
goods place weight
黄沙 北京 100
水泥 天津 200
玻璃 上海 300

我需要的查询结果是这样的:
北京 天津 上海
黄沙 100
水泥 200
玻璃 300

请问这样的sql语句,哪位大拿告知一下,不胜感激。
...全文
123 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoan2014 2014-04-12
  • 打赏
  • 举报
回复
动态的方式,可根据place表的内容变化
--執行查詢
DECLARE @sql NVARCHAR(MAX)
SELECT @sql = ISNULL(@sql , '') +'[' + name + '],' FROM  place  AS a
SET @sql = 'SELECT * FROM   main PIVOT(SUM(weight1) FOR place IN ('+ LEFT(@sql , LEN(@sql) - 1)+ ')) a'
PRINT @sql
EXEC(@sql) 
xiaozi161 2014-04-12
  • 打赏
  • 举报
回复
这样写不行吧,我的数据量很多的,每个表不止3个数据啊,能写的动态点么
yoan2014 2014-04-12
  • 打赏
  • 举报
回复



IF EXISTS(
       SELECT NAME
       FROM   sys.objects AS o
       WHERE  NAME = 'test'
   )
    DROP TABLE test
GO
CREATE TABLE test
(
	goods       NVARCHAR(03),
	place       NVARCHAR(02),
	WEIGHT1     INT
)
GO
INSERT INTO test
SELECT N'黃沙',
       N'北京',
       100 UNION ALL
SELECT N'水泥',
       N'天津',
       200 UNION ALL
SELECT N'玻璃',
       N'上海',
       300

--執行查詢
SELECT *
FROM   test PIVOT(SUM(weight1) FOR place IN ([北京], [天津], [上海])) a
       
       /*結果
       goods 北京          天津          上海
       ----- ----------- ----------- -----------
       水泥    NULL        200         NULL
       玻璃    NULL        NULL        300
       黃沙    100         NULL        NULL
       
       (3 row(s) affected)
       */
renliquan 2014-04-12
  • 打赏
  • 举报
回复
我也来复习一下行转列

select * form main pivot(sum(weight) for place in ([北京],[ 天津],[上海])) as a
伤痕累累 2014-04-12
  • 打赏
  • 举报
回复
declare @sql nvarchar(max)
select @sql=isnull(@sql,'')+',sum(case when place='''+rtrim(name)+''' then weight else 0 end)['+rtrim(name)+']' from place
set @sql='select m.goods'+@sql+' from goods as g left join main as m on m.goods=g.name group by m.goods,g.id order by g.id'
execute(@sql)
习惯性蹭分 2014-04-12
  • 打赏
  • 举报
回复

use test
create table  main(goods varchar(30),place varchar(50),weight int)
insert into  main 
select '黃沙'     ,     '北京',        100 union all
select '水泥'     ,     '天津',         200 union all
select '玻璃'     ,     '上海',         300 

declare @sql varchar(max)
select @sql=isnull(@sql+',','')+quotename(place,'[') from main 
group by place
set @sql='select * from main pivot (max(weight) for place in('+@sql+'))p'
--print @sql
exec (@sql)
 

34,590

社区成员

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

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