请教SQL实现

smartlylife 2005-04-21 02:55:45
码表sys_commoncodedata (此表数据是可以修改的,修改后查询得出来的数据也对应变化,如多了一个三星,查询结果中就要多一个三星级,三星级有几个)
code_id(主键)  code_no  data_name
  1 1 四星级
2 1 五星级
  3 2 已开业
  4 2 整修期间
  5 2 已停业

数据表hotelinfo
hotel_id(主键) gourpid hotel_star hotel_status  hotel_bed
  1      1     1     3      3
  2      1     1     3      4
  3      2     1     3      7
  4      1     1     4      7
  4      1     1     4      7

模拟的数据如上,就是我对hotelinfo.groupid = 1查询,会hotel_star,hotel_status分别取得同code_no下的数据,再对应的去统计同一个groupid下有几个旅馆,hotel_status类似

如果可以对所有groupid直接统计是最好了,如果不行,groupid可以是给定的

效果是对于同一个groupid分组进行统计统计完的效果如下:
groupid  hotel_bed总数  data_name_star  五星级有几个  data_name_star 四星级有几个  data_name_status 已开业数  data_name_status  整修期间数  data_name_status 已停业数



1      21        五星级       0       四星级    4        已开业 2    整修期间 2       已停业     0

2      7         五星级 0 四星级    1        已开业     0    整修期间       1       已停业     0


To pengdali(大力 V3.0)
因为对本论坛不是很熟,刚刚心急就结帖给分了,结果帖子到已解决区了,可否再去http://community.csdn.net/Expert/topic/3954/3954776.xml?temp=.8151667看看原来的帖子
...全文
218 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
smartlylife 2005-04-21
  • 打赏
  • 举报
回复
回复人:zjcxc(邹建) () 信誉:537 2005-4-21 15:26:52 得分: 100 删除
smartlylife 2005-04-21
  • 打赏
  • 举报
回复
奇怪了,我给了分怎么看不到,在管理界面中能看到给了分,在普通界面中怎么看不到
smartlylife 2005-04-21
  • 打赏
  • 举报
回复
啊,因为设计的人要把很多类似的放在一张表里做了通用的一个模块,所以数据有点多,我对SQL Server不懂,只会简单的增删改,看来这种方法行不通了,只能用程序去处理,主要是多次连接数据库程序运行速度快大大降低,试着程序与SQL结合处理了,多谢你了
zjcxc 元老 2005-04-21
  • 打赏
  • 举报
回复
25000也太多了吧? select最多有4096列
smartlylife 2005-04-21
  • 打赏
  • 举报
回复
这样的呀,我试试看可不可以commoncodedata 这张表目前有25000条记录左右
zjcxc 元老 2005-04-21
  • 打赏
  • 举报
回复
数据太多,导致生成的sql语句被截断吧,你试试控制一下处理的数据条数(from sys_commoncodedata )表的记录条数.
smartlylife 2005-04-21
  • 打赏
  • 举报
回复
很奇怪,我用你的就是正确的,但是一移到我所在的实际库中就出错

服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: ',' 附近有语法错误。

这种SQL不知道在Java里可不可以用,我在查询分析器中把go提上一行都出错,我SQL菜鸟,见笑了
zjcxc 元老 2005-04-21
  • 打赏
  • 举报
回复
我只发现一个字段拼写错误.
zjcxc 元老 2005-04-21
  • 打赏
  • 举报
回复
CREATE TABLE [dbo].[sys_CommonCodeData] (
[code_id] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[code_no] [numeric](18, 0) NOT NULL ,
[data_no] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[data_name] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[data_remark] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[hotel_info] (
[hotel_id] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_no] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[GroupId] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_star] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_grade] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_status] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_name] [varchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_rep] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_res] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_sec] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_add] [varchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_phone] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_sec_phone] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_stime] [datetime] NOT NULL ,
[hotel_room] [numeric](18, 0) NOT NULL ,
[hotel_bed] [numeric](18, 0) NOT NULL ,
[hotel_logout] [char] (1) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[initpass] [varchar] (16) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO


declare @s1 varchar(8000), @s2 varchar(8000)
select @s1='',@s2=''
select @s1=@s1+',data_name_star='+quotename(data_name,'''')
+','+quotename(data_name+'有几个')+'=isnull(sum(case hotel_star when '
+rtrim(code_id)+' then 1 end),0)'
from sys_commoncodedata
where code_no=1
select @s2=@s2+',data_name_star='+quotename(data_name,'''')
+','+quotename(data_name+'有几个')+'=isnull(sum(case hotel_status when '
+rtrim(code_id)+' then 1 end),0)'
from sys_commoncodedata
where code_no=2
exec('select GroupId,sum(hotel_bed) hotel_bed总数'+@s1+@s2+'
from hotel_info
group by GroupId')
go

drop table hotel_info,sys_commoncodedata
smartlylife 2005-04-21
  • 打赏
  • 举报
回复
declare @s1 varchar(8000), @s2 varchar(8000)
select @s1='',@s2=''
select @s1=@s1+',data_name_star='+quotename(data_name,'''')
+','+quotename(data_name+'有几个')+'=isnull(sum(case hotel_star when '
+rtrim(code_id)+' then 1 end),0)'
from sys_commoncodedata
where code_no=1
select @s2=@s2+',data_name_star='+quotename(data_name,'''')
+','+quotename(data_name+'有几个')+'=isnull(sum(case hotel_status when '
+rtrim(code_id)+' then 1 end),0)'
from sys_commoncodedata
where code_no=2
exec('select gourpid,sum(hotel_bed) hotel_bed总数'+@s1+@s2+'
from hotel_info
group by gourpid')
go

我改了一下hotelinfo成hotel_info别的都一样,可是报下面的错

服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: ',' 附近有语法错误。
Ctrl+F5是提示命令已成功完成。


CREATE TABLE [dbo].[sys_CommonCodeData] (
[code_id] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[code_no] [numeric](18, 0) NOT NULL ,
[data_no] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[data_name] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[data_remark] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[hotel_info] (
[hotel_id] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_no] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[GroupId] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_star] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_grade] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_status] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_name] [varchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_rep] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_res] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_sec] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_add] [varchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_phone] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_sec_phone] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_stime] [datetime] NOT NULL ,
[hotel_room] [numeric](18, 0) NOT NULL ,
[hotel_bed] [numeric](18, 0) NOT NULL ,
[hotel_logout] [char] (1) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[initpass] [varchar] (16) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

smartlylife 2005-04-21
  • 打赏
  • 举报
回复
declare @s1 varchar(8000), @s2 varchar(8000)
select @s1='',@s2=''
select @s1=@s1+',data_name_star='+quotename(data_name,'''')
+','+quotename(data_name+'有几个')+'=isnull(sum(case hotel_star when '
+rtrim(code_id)+' then 1 end),0)'
from sys_commoncodedata
where code_no=1
select @s2=@s2+',data_name_star='+quotename(data_name,'''')
+','+quotename(data_name+'有几个')+'=isnull(sum(case hotel_status when '
+rtrim(code_id)+' then 1 end),0)'
from sys_commoncodedata
where code_no=2
exec('select gourpid,sum(hotel_bed) hotel_bed总数'+@s1+@s2+'
from hotel_info
group by gourpid')
go

我改了一下hotelinfo成hotel_info别的都一样,可是报下面的错

服务器: 消息 170,级别 15,状态 1,行 1
第 1 行: ',' 附近有语法错误。
Ctrl+F5是提示命令已成功完成。


CREATE TABLE [dbo].[sys_CommonCodeData] (
[code_id] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[code_no] [numeric](18, 0) NOT NULL ,
[data_no] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[data_name] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[data_remark] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[hotel_info] (
[hotel_id] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_no] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[GroupId] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_star] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_grade] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_status] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_name] [varchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_rep] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_res] [varchar] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_sec] [varchar] (36) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_add] [varchar] (40) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_phone] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_sec_phone] [varchar] (16) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[hotel_stime] [datetime] NOT NULL ,
[hotel_room] [numeric](18, 0) NOT NULL ,
[hotel_bed] [numeric](18, 0) NOT NULL ,
[hotel_logout] [char] (1) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[initpass] [varchar] (16) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

zjcxc 元老 2005-04-21
  • 打赏
  • 举报
回复
--测试数据
create table sys_commoncodedata(code_id int primary key,code_no int,data_name nvarchar(10))
insert sys_commoncodedata
select 1,1,'四星级'
union all select 2,1,'五星级'
union all select 3,2,'已开业'
union all select 4,2,'整修期间'
union all select 5,2,'已停业'

create table hotelinfo(hotel_id int,gourpid int,hotel_star int,hotel_status int,hotel_bed int)
insert hotelinfo
select 1,1,1,3,3
union all select 2,1,1,3,4
union all select 3,2,1,3,7
union all select 4,1,1,4,7
union all select 5,1,1,4,7
go

--查询
declare @s1 varchar(8000),@s2 varchar(8000)
select @s1='',@s2=''
select @s1=@s1+',data_name_star='+quotename(data_name,'''')
+','+quotename(data_name+'有几个')+'=isnull(sum(case hotel_star when '
+rtrim(code_id)+' then 1 end),0)'
from sys_commoncodedata
where code_no=1
select @s2=@s2+',data_name_star='+quotename(data_name,'''')
+','+quotename(data_name+'有几个')+'=isnull(sum(case hotel_status when '
+rtrim(code_id)+' then 1 end),0)'
from sys_commoncodedata
where code_no=2
exec('select gourpid,sum(hotel_bed) hotel_bed总数'+@s1+@s2+'
from hotelinfo
group by gourpid')
go

--删除测试
drop table hotelinfo,sys_commoncodedata

34,594

社区成员

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

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