sql结果记录横向转换问题 请指教

fanbonbon 2007-09-24 11:53:46
目前结果记录如下
产品名称 产品类型 产品数量 时间类别
财富广场 办公 26 a
财富广场 办公 5 b
财富广场 办公 2 c
财富广场 公寓 4 a
财富广场 公寓 5 b
财富广场 公寓 1 c
财富广场 商铺 2 c

想转换成如下结果记录
产品名称 产品类型 (产品数量)时间类别a 时间类别b 时间类别c 时间类别d
财富广场 办公 26 5 2 0
财富广场 公寓 4 5 1 0
财富广场 商铺 0 0 2 0

总共有4类 时间类别 a b c d
没有记录的就显示成 0
有的话就横向填进去
谢谢先
...全文
238 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanbonbon 2007-09-24
  • 打赏
  • 举报
回复
顶一下 先吃饭
fanbonbon 2007-09-24
  • 打赏
  • 举报
回复
乌龟 小楼 呢
还没吃饭 饿死了快 -_-
fanbonbon 2007-09-24
  • 打赏
  • 举报
回复
按你们说的方法 我改的如下 请帮我看看哪里出了问题
select 项目名称,产品类型,
时间a=sum(case 时间段 when 'a' then 套数 else 0 end),
时间b=sum(case 时间段 when 'b' then 套数 else 0 end),
时间c=sum(case 时间段 when 'c' then 套数 else 0 end),
时间d=sum(case 时间段 when 'd' then 套数 else 0 end)
from
(SELECT p_project.projname as 项目名称,
p_building.bldproperty as 产品类型,
count(1) as 套数,
(case when datediff(day,qsdate,getdate())<=7 then 'a'
when datediff(day,qsdate,getdate())>7 and datediff(day,qsdate,getdate())<=30 then 'b'
when datediff(day,qsdate,getdate())>30 and datediff(day,qsdate,getdate())<=90 then 'c'
else 'd' end) as 时间段
FROM p_project
left join p_building on p_project.projGUID=p_building.projGUID
left join p_room on p_building.bldGUID=p_room.bldGUID
left join s_order on s_order.roomGUID=p_room.roomGUID
left join ep_building on ep_building.bldguid = p_building.bldguid
WHERE 1=1 and s_order.status='激活' and s_order.ordertype<>'预留' and p_project.projname in ( '财富广场' )
GROUP BY p_project.projname,
p_building.bldproperty,
(case when datediff(day,qsdate,getdate())<=7 then 'a'
when datediff(day,qsdate,getdate())>7 and datediff(day,qsdate,getdate())<=30 then 'b'
when datediff(day,qsdate,getdate())>30 and datediff(day,qsdate,getdate())<=90 then 'c'
else 'd' end)
ORDER BY p_project.projname,
p_building.bldproperty,
(case when datediff(day,qsdate,getdate())<=7 then 'a'
when datediff(day,qsdate,getdate())>7 and datediff(day,qsdate,getdate())<=30 then 'b'
when datediff(day,qsdate,getdate())>30 and datediff(day,qsdate,getdate())<=90 then 'c'
else 'd' end)
)
group by 项目名称,产品类型
晓风残月0110 2007-09-24
  • 打赏
  • 举报
回复
使用top了吗?加上括号
fanbonbon 2007-09-24
  • 打赏
  • 举报
回复
我的为什么会提示出错呢
“除非同时指定了 TOP,否则 ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。”
Limpire 2007-09-24
  • 打赏
  • 举报
回复
时间类别a=sum(case 时间类别 when 'a' then 产品数量 else 0 end),
时间类别b=sum(case 时间类别 when 'b' then 产品数量 else 0 end),
时间类别c=sum(case 时间类别 when 'c' then 产品数量 else 0 end),
时间类别d=sum(case 时间类别 when 'd' then 产品数量 else 0 end)
--------------------------------
when 'a' --用具体的时间列别名称替换,下同。
when 'b'
when 'c'
when 'd'
Limpire 2007-09-24
  • 打赏
  • 举报
回复
--测试数据:@Test
declare @Test table(产品名称 varchar(8),产品类型 varchar(4),产品数量 int,时间类别 varchar(1))
insert @Test
select '财富广场','办公',26,'a' union all
select '财富广场','办公',5,'b' union all
select '财富广场','办公',2,'c' union all
select '财富广场','公寓',4,'a' union all
select '财富广场','公寓',5,'b' union all
select '财富广场','公寓',1,'c' union all
select '财富广场','商铺',2,'c'

select
产品名称,
产品类型,
时间类别a=sum(case 时间类别 when 'a' then 产品数量 else 0 end),
时间类别b=sum(case 时间类别 when 'b' then 产品数量 else 0 end),
时间类别c=sum(case 时间类别 when 'c' then 产品数量 else 0 end),
时间类别d=sum(case 时间类别 when 'd' then 产品数量 else 0 end)
from @Test
group by 产品名称,产品类型

/*
产品名称 产品类型 时间类别a 时间类别b 时间类别c 时间类别d
财富广场 办公 26 5 2 0
财富广场 公寓 4 5 1 0
财富广场 商铺 0 0 2 0
*/
fanbonbon 2007-09-24
  • 打赏
  • 举报
回复
我的记录是个结果集
按你说的第一种 select 产品名称,产品类型 from (select 产品名称,产品类型... group by ... oder by ... ) group by 产品名称,产品类型
会提示出错
“除非同时指定了 TOP,否则 ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。”
dawugui 2007-09-24
  • 打赏
  • 举报
回复
create table tb (产品名称 varchar(10),产品类型 varchar(10),产品数量 int,时间类别 varchar(10))
insert into tb values('财富广场','办公', 26,'a')
insert into tb values('财富广场','办公', 5,'b')
insert into tb values('财富广场','办公', 2,'c')
insert into tb values('财富广场','公寓', 4,'a')
insert into tb values('财富广场','公寓', 5,'b')
insert into tb values('财富广场','公寓', 1,'c')
insert into tb values('财富广场','商铺', 2,'c')
go
--1.静态SQL
select 产品名称,产品类型,
sum(case 时间类别 when 'a' then 产品数量 else 0 end) '时间类别a',
sum(case 时间类别 when 'b' then 产品数量 else 0 end) '时间类别b',
sum(case 时间类别 when 'c' then 产品数量 else 0 end) '时间类别c',
sum(case 时间类别 when 'd' then 产品数量 else 0 end) '时间类别d'
from tb
group by 产品名称,产品类型
/*
产品名称 产品类型 时间类别a 时间类别b 时间类别c 时间类别d
---------- ---------- ----------- ----------- ----------- -----------
财富广场 办公 26 5 2 0
财富广场 公寓 4 5 1 0
财富广场 商铺 0 0 2 0
*/
--2.动态SQL
declare @sql varchar(8000)
set @sql = 'select 产品名称,产品类型'
select @sql = @sql + ' , sum(case 时间类别 when ''' + 时间类别 + ''' then 产品数量 else 0 end) [时间类别' + 时间类别 + ']'
from (select distinct 时间类别 from tb) as a
set @sql = @sql + ' from tb group by 产品名称,产品类型'
exec(@sql)
/*
产品名称 产品类型 时间类别a 时间类别b 时间类别c
---------- ---------- ----------- ----------- -----------
财富广场 办公 26 5 2
财富广场 公寓 4 5 1
财富广场 商铺 0 0 2
*/

drop table tb
dawugui 2007-09-24
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select 产品名称,产品类型'
select @sql = @sql + ' , sum(case 时间类别 when ''' + 时间类别 + ''' then 产品数量 else 0 end) [时间类别' + 时间类别 + ']'
from (select distinct 时间类别 from 表) as a
set @sql = @sql + ' from 表 group by 产品名称,产品类型'
exec(@sql)
dawugui 2007-09-24
  • 打赏
  • 举报
回复
select 产品名称,产品类型,
sum(case 时间类别 when 'a' then 产品数量 else 0 end) '时间类别a',
sum(case 时间类别 when 'b' then 产品数量 else 0 end) '时间类别b',
sum(case 时间类别 when 'c' then 产品数量 else 0 end) '时间类别c',
sum(case 时间类别 when 'd' then 产品数量 else 0 end) '时间类别d'
from 表
group by 产品名称,产品类型
brother2605 2007-09-24
  • 打赏
  • 举报
回复
貌似不能在子查询里面用ORDER BY
brother2605 2007-09-24
  • 打赏
  • 举报
回复
select 项目名称,产品类型,
时间a=sum(case 时间段 when 'a' then 套数 else 0 end),
时间b=sum(case 时间段 when 'b' then 套数 else 0 end),
时间c=sum(case 时间段 when 'c' then 套数 else 0 end),
时间d=sum(case 时间段 when 'd' then 套数 else 0 end)
from
(SELECT p_project.projname as 项目名称,
p_building.bldproperty as 产品类型,
(case when datediff(day,qsdate,getdate())<=7 then 'a'
when datediff(day,qsdate,getdate())>7 and datediff(day,qsdate,getdate())<=30 then 'b'
when datediff(day,qsdate,getdate())>30 and datediff(day,qsdate,getdate())<=90 then 'c'
else 'd' end) as 时间段,
count(1) as 套数
FROM p_project
left join p_building on p_project.projGUID=p_building.projGUID
left join p_room on p_building.bldGUID=p_room.bldGUID
left join s_order on s_order.roomGUID=p_room.roomGUID
left join ep_building on ep_building.bldguid = p_building.bldguid
WHERE 1=1 and s_order.status='激活' and s_order.ordertype<>'预留' and p_project.projname in ( '财富广场' )
GROUP BY p_project.projname,
p_building.bldproperty,
(case when datediff(day,qsdate,getdate())<=7 then 'a'
when datediff(day,qsdate,getdate())>7 and datediff(day,qsdate,getdate())<=30 then 'b'
when datediff(day,qsdate,getdate())>30 and datediff(day,qsdate,getdate())<=90 then 'c'
else 'd' end)
--ORDER BY p_project.projname,
-- p_building.bldproperty,
-- (case when datediff(day,qsdate,getdate())<=7 then 'a'
-- when datediff(day,qsdate,getdate())>7 and datediff(day,qsdate,getdate())<=30 then 'b'
-- when datediff(day,qsdate,getdate())>30 and datediff(day,qsdate,getdate())<=90 then 'c'
-- else 'd' end)
) a
group by 项目名称,产品类型
-----------------------------
--把子查询里面的排序去掉

34,576

社区成员

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

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