SQL中GROUP BY的问题,请高手指点。

yw1688 2008-08-05 09:48:59
现在有三个表,结构如下:
create table gq_type1 --一级分类
(
id int identity(1,1) primary key,
type1_name nvarchar(20) not null --一级分类名称
)
go
create table gq_type2 --二级分类
(
id int identity(1,1) primary key,
type1_id int foreign key references gq_type1(id),
type2_name nvarchar(20) not null,
)
go
create table product_gq_info --信息表(本表的其它字段省略)
(
id int identity(1,1), --产品编号
type1_id int foreign key references gq_type1(id) on delete cascade, --大类别编号,必填
type2_id int foreign key references gq_type2(id) on delete cascade, --小类别编号,必填
type3_id int foreign key references gq_type3(id) on delete cascade, --三级分类
gq_type int default 0, --类型
youxiaoqi varchar(10), --本信息有效期
jointime smalldatetime default getdate() --发布时间
)
go

要实现的效果是这样的:
第一行:列出信息表中,各个大类有多少个
SQL语句:select gq_type1.id,type1_name,count(product_gq_info.type1_id) as pnum from product_gq_info right join gq_type1 on product_gq_info.type1_id=gq_type1.id group by all gq_type1.id,type1_name
id type1_name pnum
----------- -------------------- -----------
1 鲜切花类 20
2 盆栽植物类 1
3 绿化苗木类 1
4 盆景奇石类 0
5 园林资材 0
6 园林景观类 0
效果就是我要的效果
第二行,显示信息表下某个指定的大类下的各个小类,并得出各小类的信息有多少个。下面是当前gq_type2表中的数据,注意:这里面type1_id=3的有两个。
id type1_id type2_name
----------- ----------- --------------------
1 1 hu
2 2 观叶植物
3 5 园林机具
4 6 绿化施工
5 4 树桩盆景
6 3 常绿乔木
7 3 常绿灌木
GROUP GY SQL语句:select gq_type2.id,type2_name,count(product_gq_info.type2_id) as pnum2 from product_gq_info right join gq_type2 on product_gq_info.type2_id=gq_type2.id where product_gq_info.type1_id=3 and gq_type=1 and dateadd(day,cast(youxiaoqi as int),product_gq_info.jointime)>getdate() group by product_gq_info.type2_id,gq_type2.id,type2_name
运行结果:
id type2_name type1_id pnum2
----------- -------------------- ----------- -----------
1 hu 1 0
2 观叶植物 2 0
3 园林机具 5 0
4 绿化施工 6 0
5 树桩盆景 4 0
6 常绿乔木 3 1
7 常绿灌木 3 0
去掉group by all中的那个all运行结果:
id type2_name type1_id pnum2
----------- -------------------- ----------- -----------
6 常绿乔木 3 1
很明显,这里有一个type1_id=3的那个类没有显示出来
请问下,如何写才能让它只显示某个指定大类的小类名称,如果该类下面那个小类没有内容也要显示出来该小类名称。但是又不显示其它大类下的小类呢?
...全文
160 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yw1688 2008-09-04
  • 打赏
  • 举报
回复
很久没上了,今天来一看还是没有人解决哈,算了,不加那个all凑合着用吧。散分了。
yw1688 2008-08-05
  • 打赏
  • 举报
回复
高手呢?快来啊。
yw1688 2008-08-05
  • 打赏
  • 举报
回复
我都跟了条件的啊。如果我把那后面的条件去掉,这样写SQL语句:
select gq_type2.id,type2_name,gq_type2.type1_id,count(product_gq_info.type2_id) as pnum2 from gq_type2 left join product_gq_info on product_gq_info.type2_id=gq_type2.id where gq_type2.type1_id=3 group by gq_type2.type1_id,gq_type2.id,type2_name
执行的结果就对:
id type2_name type1_id pnum2
----------- -------------------- ----------- -----------
6 常绿乔木 3 1
7 常绿灌木 3 0
但是程序又必须限制那些条件啊。该怎么办呢?
水族杰纶 2008-08-05
  • 打赏
  • 举报
回复
顶~
中国风 2008-08-05
  • 打赏
  • 举报
回复
去掉group by all中的那个all运行结果:

有條件時all才會有做用,不加where時沒有作用
yw1688 2008-08-05
  • 打赏
  • 举报
回复
顶上去。
Mysql数据库设计 数据库设计 MYSQL数据库设计 串转义序列 \0 NUL(ASCLL 0) \' \" \b 退格 \n 新⾏ \r 回车 \t 制表符 \\ 反斜杠 数值列类型 TINYINT 1字节 ⾮常⼩的整数 有符号值:-128⾄127 ⽆符号值:0⾄255 SMALLINT 2字节 较⼩的整数 有符号值:-32768 MEDIUMINT 3字节 等⼤⼩的整数 有符号值: INT 4字节 标准整数 有符号值: BIGINT 8字节 ⼤整数 有符号值: FLOAT 4字节 单精度浮点数 有符号值: DOUBLE 8字节 双精度浮点数 有符号值: DECIMAL M字节 ⼀个串的浮点数 有符号值: CHAR VARCHAR TINYBLOB BLOB MEDIUMBLOB LONGBLOB TINYTEXT TEXT MEDIUMTEXT LONGTEXT ENUM SET ⽇期与时间类型格式 DATE "YYYY-MM-DD" TIME "hh:mm:ss" DATETIME "YYYY-MM-DD hh:mm:ss" TIMESTAMP "YYYYMMDDhhmmss" YEAR "YYYY" 数值列类型的取值范围 数值列的列属性: AUTO_INCREMENT 创建⼀个唯⼀标志符号或许顺序值 create table a ( I int auto_increment not null primary key); UNSIGNED 禁⽌此属性存在负值 create table test(num tingint , num2 tingint unsigned); NULL and NOT NULL 缺省为NULL create talbe test (num int, num2 int default 1, num3 int default null) 运算符 = 等于 <>或者!= 不等于 <=> NULL安全的等于(NULL-safe) < ⼩于 > ⼤于 <= ⼩于等于 >= ⼤于等于 BETWEEN 存在与指定范围 IN 存在于指点集合 IS NULL 为NULL IS NOT NULL 不为NULL LIKE 通配符匹配 REGEXP或者RLIKE 正则表达式匹配 %(百分号) a%b表⽰以a开头b结尾的任意长度的字符串 _(下横线) a_b表⽰以a开头b结尾的长度为3的任意字符, PRIMARY KEY UNIQUE NOT NULL AUTO_INCREMENT DEFAULT default_value PRIMARY KEY 与UNIQUE 数据库操作: show database; show tables; use dataname; create database 数据库名; create table test( id int primary key auto_increment, title varchar(16) ); describe 表名; desc 表名; drop talbe tablename; alter talbe 表名 action add 列名 add primary key alter 列名 set default drop 列名 drop primary key drop index index_name rename as 新表名 insert into 表名(id,name,...) valuse(1,liqingbo); update 表名 set 列名=数据值 where ⼦句; delet from 表名 where ⼦句; select group by having order by limit desc asc count sum avg max min resource mysql_connect(host,root,password); mysql_close(); bool mysql_select_db(tablename[,],连接返回变量); resource mysql_query(SQL语句) resource mysql_db_query(tablename[,]); array mysql_fetch_row(); array mysql_fetch_array(); MYSQL_ASSOC: MYSQL_NUM: MYSQL_BOTH: mysql_num_fields(); 取得结果集字段的数⽬ mysql_num_rows(); 取得结果集⾏的数⽬ mysql_result(); mysql_free_result(); mysql_close(); mysql_pconnect; mysql_create_db; m

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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