问个关于查询问题

iamme81 2008-04-03 04:16:32
现有表asd
表中结构如下

create table asd
(aa int,bb int)

insert asd values(1,1)
insert asd values(1,2)
insert asd values(1,3)
insert asd values(2,1)
insert asd values(3,1)
insert asd values(3,2)
insert asd values(3,3)
insert asd values(4,1)
insert asd values(4,2)
insert asd values(5,1)

现在要显示aa共有行数为一个指定数字的aa列,bb列和总和数
如:要显示aa共有3行则显示
a b 共有
1 1 3
1 2 3
1 3 3
3 1 3
3 2 3
3 3 3
如:要显示aa共有2行则显示
a b 共有
4 1 2
4 2 2

查询语句该如何写

在sybase中写成如下语句有正确结果,但是在SQL Servr中会要你bb必须包含在group中,但将bb写入group中后查询结果则完全不正确,去掉bb列可以获得正确的执行结果但不符合需求
select aa,bb,count(aa) from asd
group by aa having count(aa)=3

...全文
89 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamme81 2008-04-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 iamme81 的回复:]
引用 3 楼 dawugui 的回复:
--上面少了个共有
--使用变量完成

SQL codecreate table asd (aa int,bb int)
insert asd values(1,1)
insert asd values(1,2)
insert asd values(1,3)
insert asd values(2,1)
insert asd values(3,1)
insert asd values(3,2)
insert asd values(3,3)
insert asd values(4,1)
insert asd values(4,2)
insert asd values(5,1)

declare @aa as int

se…
[/Quote]
我的意思是大于两条的

比如count(aa)>2且也要共有几条记录,你的方法就取不出这个结果了
iamme81 2008-04-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 happyflystone 的回复:]
SQL codecreate table asd
(aa int,bb int)

insert asd values(1,1)
insert asd values(1,2)
insert asd values(1,3)
insert asd values(2,1)
insert asd values(3,1)
insert asd values(3,2)
insert asd values(3,3)
insert asd values(4,1)
insert asd values(4,2)
insert asd values(5,1)

go
select a.*,b.cnt
from asd a
right join (
select aa,count(aa) as cnt from asd
group by aa…
[/Quote]

完全正确,谢谢楼上了
dawugui 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 iamme81 的回复:]
引用 3 楼 dawugui 的回复:
--上面少了个共有
--使用变量完成

SQL codecreate table asd (aa int,bb int)
insert asd values(1,1)
insert asd values(1,2)
insert asd values(1,3)
insert asd values(2,1)
insert asd values(3,1)
insert asd values(3,2)
insert asd values(3,3)
insert asd values(4,1)
insert asd values(4,2)
insert asd values(5,1)

declare @aa as int

se…
[/Quote]
你要去重复的话,加个distinct.
iamme81 2008-04-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
--上面少了个共有
--使用变量完成

SQL codecreate table asd (aa int,bb int)
insert asd values(1,1)
insert asd values(1,2)
insert asd values(1,3)
insert asd values(2,1)
insert asd values(3,1)
insert asd values(3,2)
insert asd values(3,3)
insert asd values(4,1)
insert asd values(4,2)
insert asd values(5,1)

declare @aa as int

set @aa = 3
select * , 共有 = @aa from asd…
[/Quote]

这个方法过于取巧了,不能算正确,若要求取出大于重复两条的记录结果就不正确了
-狙击手- 2008-04-03
  • 打赏
  • 举报
回复
create table asd 
(aa int,bb int)

insert asd values(1,1)
insert asd values(1,2)
insert asd values(1,3)
insert asd values(2,1)
insert asd values(3,1)
insert asd values(3,2)
insert asd values(3,3)
insert asd values(4,1)
insert asd values(4,2)
insert asd values(5,1)

go
select a.*,b.cnt
from asd a
right join (
select aa,count(aa) as cnt from asd
group by aa
having count(aa)=2 ) b
on a.aa = b.aa

drop table asd

/*

aa bb cnt
----------- ----------- -----------
4 1 2
4 2 2

(所影响的行数为 2 行)

*/
-狙击手- 2008-04-03
  • 打赏
  • 举报
回复
create table asd
(aa int,bb int)

insert asd values(1,1)
insert asd values(1,2)
insert asd values(1,3)
insert asd values(2,1)
insert asd values(3,1)
insert asd values(3,2)
insert asd values(3,3)
insert asd values(4,1)
insert asd values(4,2)
insert asd values(5,1)

go
select a.*,b.cnt
from asd a
right join (
select aa,count(aa) as cnt from asd
group by aa
having count(aa)=3 ) b
on a.aa = b.aa

drop table asd

/8

aa bb cnt
----------- ----------- -----------
1 1 3
1 2 3
1 3 3
3 1 3
3 2 3
3 3 3

(所影响的行数为 6 行)
*/
dawugui 2008-04-03
  • 打赏
  • 举报
回复
--这是不用变量的,具体需要哪个,你自己选择.
create table asd (aa int,bb int) 
insert asd values(1,1)
insert asd values(1,2)
insert asd values(1,3)
insert asd values(2,1)
insert asd values(3,1)
insert asd values(3,2)
insert asd values(3,3)
insert asd values(4,1)
insert asd values(4,2)
insert asd values(5,1)

select * , 共有 = 3 from asd where aa in (select aa from asd group by aa having count(*) = 3)
/*
aa bb 共有
----------- ----------- -----------
1 1 3
1 2 3
1 3 3
3 1 3
3 2 3
3 3 3

(所影响的行数为 6 行)
*/

select * , 共有 = 2 from asd where aa in (select aa from asd group by aa having count(*) = 2)
/*
aa bb 共有
----------- ----------- -----------
4 1 2
4 2 2

(所影响的行数为 2 行)
*/

drop table asd
dawugui 2008-04-03
  • 打赏
  • 举报
回复
--上面少了个共有
--使用变量完成
create table asd (aa int,bb int) 
insert asd values(1,1)
insert asd values(1,2)
insert asd values(1,3)
insert asd values(2,1)
insert asd values(3,1)
insert asd values(3,2)
insert asd values(3,3)
insert asd values(4,1)
insert asd values(4,2)
insert asd values(5,1)

declare @aa as int

set @aa = 3
select * , 共有 = @aa from asd where aa in (select aa from asd group by aa having count(*) = @aa)
/*
aa bb 共有
----------- ----------- -----------
1 1 3
1 2 3
1 3 3
3 1 3
3 2 3
3 3 3

(所影响的行数为 6 行)
*/

set @aa = 2
select * , 共有 = @aa from asd where aa in (select aa from asd group by aa having count(*) = @aa)
/*
aa bb 共有
----------- ----------- -----------
4 1 2
4 2 2

(所影响的行数为 2 行)
*/

drop table asd
dawugui 2008-04-03
  • 打赏
  • 举报
回复
--使用变量完成

create table asd (aa int,bb int) 
insert asd values(1,1)
insert asd values(1,2)
insert asd values(1,3)
insert asd values(2,1)
insert asd values(3,1)
insert asd values(3,2)
insert asd values(3,3)
insert asd values(4,1)
insert asd values(4,2)
insert asd values(5,1)

declare @aa as int

set @aa = 3
select * from asd where aa in (select aa from asd group by aa having count(*) = @aa)
/*
aa bb
----------- -----------
1 1
1 2
1 3
3 1
3 2
3 3

(所影响的行数为 6 行)
*/

set @aa = 2
select * from asd where aa in (select aa from asd group by aa having count(*) = @aa)
/*
aa bb
----------- -----------
4 1
4 2

(所影响的行数为 2 行)
*/

drop table asd
dawugui 2008-04-03
  • 打赏
  • 举报
回复
create table asd (aa int,bb int) 
insert asd values(1,1)
insert asd values(1,2)
insert asd values(1,3)
insert asd values(2,1)
insert asd values(3,1)
insert asd values(3,2)
insert asd values(3,3)
insert asd values(4,1)
insert asd values(4,2)
insert asd values(5,1)

select * from asd where aa in (select aa from asd group by aa having count(*) = 3)
/*
aa bb
----------- -----------
1 1
1 2
1 3
3 1
3 2
3 3

(所影响的行数为 6 行)
*/

select * from asd where aa in (select aa from asd group by aa having count(*) = 2)
/*
aa bb
----------- -----------
4 1
4 2

(所影响的行数为 2 行)
*/

drop table asd

34,593

社区成员

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

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