高手幫忙,求一交叉表的SQL語句

wushimiang12 2005-09-19 11:46:57
現有一個表TB1,其字段如下:(Name:代表姓名,Province:代表省份,Score:代表業務顧客數量)
Name Province Score
李三 四川 5
小王 四川 3
小張 廣州 3
李三 廣州 2
小張 湖南 3
李三 湖南 4

我想得到下面的結果:
姓名 四川 廣州 湖南 總計
李三 5 2 4 11
小王 3 0 0 3
小張 0 3 3 6

注意:省份必須根據TB1表中所有出現的省份進行統計
...全文
159 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
churchatp1 2005-09-19
  • 打赏
  • 举报
回复
你的表结构有问题
可以再建一个表Province(Province_id,Province_name)
Province_id Province_name
1 四川
2 广州
3 湖南
。。。。。。。

然后把所有出现得身份都建一行,然后在tb1表里面Province列改成Province_id列
然后就可以使用下面得语句了
select name,四川=sum(case Province_id when 1 then Score end),
廣州=sum(case Province_id when 2 then Score end),--这里你有几个省就列几个
湖南=sum(case Province_id when 3 then Score end),
总计=sum(score) from tbl order by name
vivianfdlpw 2005-09-19
  • 打赏
  • 举报
回复
create table A
(
Name varchar(10),
Province varchar(20),
Score int
)
insert A
select '李三','四川',5 union
select '小王','四川',3 union
select '小張','廣州',3 union
select '李三','廣州',2 union
select '小張','湖南',3 union
select '李三','湖南',4

--查询
declare @sql varchar(1000)
select @sql=''
select @sql=@sql+',sum(case when Province='''+Province+''' then Score else 0 end) as '+quotename(Province)
from A group by Province
select @sql='select Name'+@sql+',sum(Score) as 总计 from A group by Name order by Name'
exec(@sql)

--删除测试环境
drop table A


--结果
/*
Name 廣州 湖南 四川 总计
---------- ----------- ----------- ----------- -----------
李三 2 4 5 11
小王 0 0 3 3
小張 3 3 0 6
*/
wushimiang12 2005-09-19
  • 打赏
  • 举报
回复
問題解決,謝謝 newmankind(阿菠萝)、duoluohuifeng(堕落回风)、churchatp1(阿牛)、vivianfdlpw()
newmankind 2005-09-19
  • 打赏
  • 举报
回复
create table A
(
Name varchar(10),
Province varchar(20),
Score int
)
insert A
select '李三','四川',5 union
select '小王','四川',3 union
select '小張','廣州',3 union
select '李三','廣州',2 union
select '小張','湖南',3 union
select '李三','湖南',4

--测试
declare @s varchar(8000)
set @s = ''

select @s = @s +','+Province+'= sum(case province when'''+province+'''then score else 0 end)'
from A group by Province order by Province

exec ('select name '+@s+',sum(Score) As Total from A group by Name order by Name')

--测试结果
-- Name 广州 湖南 四川 Total
-- 1 李三 2 4 5 11
-- 2 小王 0 0 3 3
-- 3 小張 3 3 0 6

--测试结束
drop table A
wushimiang12 2005-09-19
  • 打赏
  • 举报
回复
首先謝謝各位的大力支持!
To:duoluohuifeng(堕落回风) 你沒有注意到“省份必須根據TB1表中所有出現的省份進行統計”這句話
To:churchatp1(阿牛) 你的要改變數據庫結構也不行的
To:vivianfdlpw() 你的語句我執行了一下,好象不行,出現如下錯誤:
伺服器: 訊息 170,層級 15,狀態 1,行 1
行 1: '?' 附近的語法不正確。
duoluohuifeng 2005-09-19
  • 打赏
  • 举报
回复

select name,sum(case province when '廣州'then score else 0 end) as 廣州 ,
sum(case province when '湖南'then score else 0 end) as 湖南 ,
sum(case province when '四川'then score else 0 end) as 四川
from a group by a.name

34,594

社区成员

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

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