稍微难点的sql语句

ych3000 2011-03-20 08:39:49
地区 国家 书名 价格

一山 KOR java 20
一山 KOR java 10
一山 KOR vb 10
上海 CHINA java 10
上海 CHINA java 30
上海 CHINA vb 10
因拉 印度 java 20
迪拉 印度 vb 10
沙拉 沙特 java 10
。。。。
。。。。
。。。。
。。。。


显示效果为
地区 书名 KOR CHINA 。。。 统计

一山 java 30 0 。。。 30
一山 vb 10 0 。。。 10
上海 java 0 40 。。。 40
上海 vb 0 10 。。。 10
。。。。
。。。。
。。。。

计 。。。。 40+ 50+ 90+

不知道 我统计的对不对

请高手 请教







...全文
172 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shawn 2011-03-21
  • 打赏
  • 举报
回复
#1.参考原贴中的行转列
#2.参考此贴中的WITH ROLLUP和GROUPINT函数
http://topic.csdn.net/u/20110321/13/0446f799-2d5a-4041-87a7-7265bead318a.html?seed=681950791&r=72280353#r_72280353
#3.用动态SQL达到你的目的
喜-喜 2011-03-20
  • 打赏
  • 举报
回复
use test
go
if object_id('test.dbo.tb') is not null drop table tb
-- 创建数据表
create table tb
(
地区 char(10),
国家 char(10),
书名 char(10),
价格 int
)
go
--插入测试数据
insert into tb select '一山','KOR','java',20
union all select '一山','KOR','java',10
union all select '一山','KOR','vb',10
union all select '上海','CHINA','java',10
union all select '上海','CHINA','java',30
union all select '上海','CHINA','vb',10
union all select '因拉','印度','java',20
union all select '迪拉','印度','vb',10
union all select '沙拉','沙特','java',10
go
--代码实现

declare @sql varchar(max)
select @sql=isnull(@sql+',','')+rtrim(国家)+'=(case 国家 when '''+rtrim(国家)+''' then 价格 else 0 end)'
from ( select distinct 国家 from tb )t
exec('select 地区,书名,'+@sql+',统计=价格 from (
select 地区,国家,书名,价格=sum(价格) from tb group by 地区,国家,书名 )t')

/*测试结果

地区 书名 CHINA KOR 沙特 印度 统计
---------------------------------------------------
迪拉 vb 0 0 0 10 10
沙拉 java 0 0 10 0 10
上海 java 40 0 0 0 40
上海 vb 10 0 0 0 10
一山 java 0 30 0 0 30
一山 vb 0 10 0 0 10
因拉 java 0 0 0 20 20

(7 行受影响)
*/
--小F-- 2011-03-20
  • 打赏
  • 举报
回复
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([地区])+'=max(case when [地区]='+quotename([地区],'''')+' then [价格] else 0 end)'
from tb group by [地区]
exec('select [地区]'+@s+',[统计]=sum([价格]) from tb group by [地区] with rollup
'
--小F-- 2011-03-20
  • 打赏
  • 举报
回复
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([地区])+'=max(case when [地区]='+quotename([地区],'''')+' then [价格] else 0 end)'
from tb group by[地区] with rollup
exec('select [地区]'+@s+',[统计]=sum([价格]) from tb group by [地区]'
--小F-- 2011-03-20
  • 打赏
  • 举报
回复
可以去参考下 行转列中的动态写法

所谓的求和也就是 右边SUM和 下面用 GROUP BY WITH ROLLUP
ych3000 2011-03-20
  • 打赏
  • 举报
回复
国家有100多个
ych3000 2011-03-20
  • 打赏
  • 举报
回复
然后 不要指定 那个国家 能不能自动显示阿
ych3000 2011-03-20
  • 打赏
  • 举报
回复
右统计和 下面统计 没出来
Shawn 2011-03-20
  • 打赏
  • 举报
回复
create table #temp
(
地区 nvarchar(10),
国家 nvarchar(10),
书名 nvarchar(10),
价格 int
)
insert #temp
select '一山', 'KOR', 'java', '20' union all
select '一山', 'KOR', 'java', '10' union all
select '一山', 'KOR', 'vb', '10' union all
select '上海', 'CHINA', 'java', '10' union all
select '上海', 'CHINA', 'java', '30' union all
select '上海', 'CHINA', 'vb', '10' union all
select '因拉', '印度', 'java', '20' union all
select '迪拉', '印度', 'vb', '10' union all
select '沙拉', '沙特', 'java', '10'
go
--SQL:仅做参考
select
地区,
书名,
[KOR] = ISNULL([KOR], 0),
[CHINA] = ISNULL([CHINA], 0),
[印度] = ISNULL([印度], 0),
[沙特] = ISNULL([沙特], 0),
统计 = ISNULL([KOR], 0) + ISNULL([CHINA], 0) + ISNULL([印度], 0) + ISNULL([沙特], 0)from
(select 地区,国家, 书名,价格 = SUM(价格) from #temp group by 地区,国家,书名) a
pivot
(max(价格) for 国家 in([KOR], [CHINA], [印度], [沙特])) b
order by 地区, 书名
/*
地区 书名 KOR CHINA 印度 沙特 统计
迪拉 vb 0 0 10 0 10
沙拉 java 0 0 0 10 10
上海 java 0 40 0 0 40
上海 vb 0 10 0 0 10
一山 java 30 0 0 0 30
一山 vb 10 0 0 0 10
因拉 java 0 0 20 0 20
*/
ych3000 2011-03-20
  • 打赏
  • 举报
回复
谁能帮我写一个 谢谢
Shawn 2011-03-20
  • 打赏
  • 举报
回复
又见列转行啊。呵呵。在CSDN上随便一搜,一大堆。
http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html?33238

34,591

社区成员

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

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