求SQL语句

fionazou 2009-12-10 11:14:43
我有如下一个表的数据;
ll pn name qty
2 aa xx 10
2 aa yy 15
2 bb zz 30
4 aa xy 15
4 ac yx 36
4 ad yy 15
.......
我需要取出取出每种ll数量最多的十大name和qty,并取出每个name对应的一个qty最多的pn和qty.第二;取出各ll数量最多的十种pn和qty,并取出每个pn对应的一个数量最多的name和qty.
...全文
86 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shabble 2009-12-11
  • 打赏
  • 举报
回复
学习了,小梁佩服啊
冷箫轻笛 2009-12-10
  • 打赏
  • 举报
回复
并取出每个name对应的一个qty最多的pn和qty

这句话何解?
是否是比如对于ll=2的纪录来讲,取出qty最多的10条以后,name的值是有可能重复的?
然后对于name=xx的纪录,其pn和qty,都取name=xx中,qty最大的那条的纪录值?
例如,如果有纪录
2 aa xx 10
2 aa1 xx 100

那最终的结果就要
2 aa1 xx 100
2 aa1 xx 100

??但是这样两条纪录就重复了呀。。。
ai_li7758521 2009-12-10
  • 打赏
  • 举报
回复
--按某一字段分组取最大(小)值所在行的数据
--(爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-10-23于浙江杭州)
/*
数据如下:
name val memo
a 2 a2(a的第二个值)
a 1 a1--a的第一个值
a 3 a3:a的第三个值
b 1 b1--b的第一个值
b 3 b3:b的第三个值
b 2 b2b2b2b2
b 4 b4b4
b 5 b5b5b5b5b5
*/
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二个值)')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('b', 1, 'b1--b的第一个值')
insert into tb values('b', 3, 'b3:b的第三个值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
go

--一、按name分组取val最大的值所在行的数据。
--方法1:
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
--方法3:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name
/*
name val memo
---------- ----------- --------------------
a 3 a3:a的第三个值
b 5 b5b5b5b5b5
*/

--二、按name分组取val最小的值所在行的数据。
--方法1:
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)
--方法3:
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值
*/

--三、按name分组取第一次出现的行所在的数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name
/*
name val memo
---------- ----------- --------------------
a 2 a2(a的第二个值)
b 1 b1--b的第一个值
*/

--四、按name分组随机取一条数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 5 b5b5b5b5b5
*/

--五、按name分组取最小的两个(N个)val
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name,a.val
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
a 2 a2(a的第二个值)
b 1 b1--b的第一个值
b 2 b2b2b2b2
*/

--六、按name分组取最大的两个(N个)val
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name , a.val
/*
name val memo
---------- ----------- --------------------
a 2 a2(a的第二个值)
a 3 a3:a的第三个值
b 4 b4b4
b 5 b5b5b5b5b5
*/
--七,如果整行数据有重复,所有的列都相同。
/*
数据如下:
name val memo
a 2 a2(a的第二个值)
a 1 a1--a的第一个值
a 1 a1--a的第一个值
a 3 a3:a的第三个值
a 3 a3:a的第三个值
b 1 b1--b的第一个值
b 3 b3:b的第三个值
b 2 b2b2b2b2
b 4 b4b4
b 5 b5b5b5b5b5
*/
--在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二个值)')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('b', 1, 'b1--b的第一个值')
insert into tb values('b', 3, 'b3:b的第三个值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
go

select * , px = identity(int,1,1) into tmp from tb

select m.name,m.val,m.memo from
(
select t.* from tmp t where val = (select min(val) from tmp where name = t.name)
) m where px = (select min(px) from
(
select t.* from tmp t where val = (select min(val) from tmp where name = t.name)
) n where n.name = m.name)

drop table tb,tmp

/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值

(2 行受影响)
*/
--在sql server 2005中可以使用row_number函数,不需要使用临时表。
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二个值)')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('b', 1, 'b1--b的第一个值')
insert into tb values('b', 3, 'b3:b的第三个值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
go

select m.name,m.val,m.memo from
(
select * , px = row_number() over(order by name , val) from tb
) m where px = (select min(px) from
(
select * , px = row_number() over(order by name , val) from tb
) n where n.name = m.name)

drop table tb

/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值

(2 行受影响)
*/
ai_li7758521 2009-12-10
  • 打赏
  • 举报
回复
--求按品牌分组,取每组点击量最高的前三条记录

CREATE TABLE TB(产品号 int,产品名 nvarchar(50), 所属品牌 nvarchar(30),访问量 int)

insert TB
SELECT 305,'紫光 8850ED','紫光',13785 UNION ALL
SELECT 1381,' DELL LATITUDE L400(10GB/24XCD)','DELL',8542 UNION ALL
SELECT 1387,'DELL LATITUDE L400(20GB/8XDVD)','DELL',3542 UNION ALL
SELECT 11119,'联想 昭阳2110CF','联想',58954 UNION ALL
SELECT 14913,'DELL LATITUDE C600','DELL',5468 UNION ALL
SELECT 16065,'联想 昭阳K21','联想',210 UNION ALL
SELECT 16876,'SONY GR18C','SONY',0 UNION ALL
SELECT 17370,'DELL 38N2-14 85C','DELL',125 UNION ALL
SELECT 19001,'DELL LATITUDE C810','DELL',3986 UNION ALL
SELECT 20402,'联想 昭阳S280CFe','联想',1578

1.--SQL 2005
SELECT C.*
FROM (SELECT DISTINCT 所属品牌 FROM TB) A JOIN
(SELECT TOP 3 *
FROM TB B
WHERE A.所属品牌=B.所属品牌
ORDER BY 访问量 DESC) C
ORDER BY 访问量 DESC

2.--
SELECT 产品号,产品名,所属品牌,访问量 FROM
(
SELECT T.* , PX = RANK() OVER(PARTITION BY 所属品牌 ORDER BY 访问量 DESC) FROM TB T
) M
WHERE PX <= 3

--SQL 2000
1.--
SELECT *
FROM TB T
WHERE (SELECT COUNT(1)+1 FROM TB WHERE 所属品牌=t.所属品牌 and 访问量>t.访问量)<=3
ORDER BY 访问量 DESC

2.--
SELECT T.* FROM TB T WHERE 访问量 IN (SELECT TOP 3 访问量 FROM TB WHERE 所属品牌 = T.所属品牌 ORDER BY MARKS DESC)


产品号 产品名 所属品牌 访问量
----------- -------------------------------------------------- ------------------------------ -----------
305 紫光 8850ED 紫光 13785
1381 DELL LATITUDE L400(10GB/24XCD) DELL 8542
11119 联想 昭阳2110CF 联想 58954
14913 DELL LATITUDE C600 DELL 5468
16065 联想 昭阳K21 联想 210
16876 SONY GR18C SONY 0
19001 DELL LATITUDE C810 DELL 3986
20402 联想 昭阳S280CFe 联想 1578

(8 行受影响)




select * from
(select top 3 * from
(select *,num=(select count(*) from tb a where a.所属品牌=b.所属品牌 and a.访问量 <b.访问量) from tb b) reny
order by num desc) a
order by num
产品号 产品名 所属品牌 访问量
----------- -------------------------------------------------- --------------------------- -----------
11119 联想 昭阳2110CF 联想 58954
305 紫光 8850ED 紫光 13785
1381 DELL LATITUDE L400(10GB/24XCD) DELL 8542
14913 DELL LATITUDE C600 DELL 5468
19001 DELL LATITUDE C810 DELL 3986
20402 联想 昭阳S280CFe 联想 1578
16065 联想 昭阳K21 联想 210
fionazou 2009-12-10
  • 打赏
  • 举报
回复
重复的都取出来.
fionazou 2009-12-10
  • 打赏
  • 举报
回复
或者我告诉你我的QQ:33507631
冷箫轻笛 2009-12-10
  • 打赏
  • 举报
回复
如果数量最多的qty中,第10个数量重复怎么处理?
fionazou 2009-12-10
  • 打赏
  • 举报
回复

fredrickhu,你好,你能不能告诉我一个QQ或者邮箱,我把表数据发给你,你一下子就能明白的.
--小F-- 2009-12-10
  • 打赏
  • 举报
回复
看得晕 
贴一个
---------------------------------
-- Author: liangCK 小梁
-- Title : 查每个分组前N条记录
-- Date : 2008-11-13 17:19:23
---------------------------------

--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VARCHAR(29),Title VARCHAR(39),Date DATETIME)
INSERT INTO #T
SELECT '001',1,'邹建','深入浅出SQLServer2005开发管理与应用实例','2008-05-10' UNION ALL
SELECT '002',1,'胡百敬','SQLServer2005性能调校','2008-03-22' UNION ALL
SELECT '003',1,'格罗夫Groff.J.R.','SQL完全手册','2009-07-01' UNION ALL
SELECT '004',1,'KalenDelaney','SQLServer2005技术内幕存储引擎','2008-08-01' UNION ALL
SELECT '005',2,'Alex.Kriegel.Boris.M.Trukhnov','SQL宝典','2007-10-05' UNION ALL
SELECT '006',2,'飞思科技产品研发中心','SQLServer2000高级管理与开发','2007-09-10' UNION ALL
SELECT '007',2,'胡百敬','SQLServer2005数据库开发详解','2008-06-15' UNION ALL
SELECT '008',3,'陈浩奎','SQLServer2000存储过程与XML编程','2005-09-01' UNION ALL
SELECT '009',3,'赵松涛','SQLServer2005系统管理实录','2008-10-01' UNION ALL
SELECT '010',3,'黄占涛','SQL技术手册','2006-01-01'

--SQL查询如下:

--按GID分组,查每个分组中Date最新的前2条记录


--1.字段ID唯一时:
SELECT * FROM #T AS T WHERE ID IN(SELECT TOP 2 ID FROM #T WHERE GID=T.GID ORDER BY Date DESC)

--2.如果ID不唯一时:
SELECT * FROM #T AS T WHERE 2>(SELECT COUNT(*) FROM #T WHERE GID=T.GID AND Date>T.Date)

--SQL Server 2005 使用新方法

--3.使用ROW_NUMBER()进行排位分组
SELECT ID,GID,Author,Title,Date
FROM
(
SELECT rid=ROW_NUMBER() OVER(PARTITION BY GID ORDER BY Date DESC),*
FROM #T
) AS T
WHERE rid<=2

--4.使用APPLY
SELECT DISTINCT b.*
FROM #T AS a
CROSS APPLY
(
SELECT TOP(2) * FROM #T WHERE a.GID=GID ORDER BY Date DESC
) AS b


--结果
/*

ID GID Author Title Date
---- ----------- ----------------------------- --------------------------------------- -----------------------
003 1 格罗夫Groff.J.R. SQL完全手册 2009-07-01 00:00:00.000
004 1 KalenDelaney SQLServer2005技术内幕存储引擎 2008-08-01 00:00:00.000
005 2 Alex.Kriegel.Boris.M.Trukhnov SQL宝典 2007-10-05 00:00:00.000
007 2 胡百敬 SQLServer2005数据库开发详解 2008-06-15 00:00:00.000
009 3 赵松涛 SQLServer2005系统管理实录 2008-10-01 00:00:00.000
010 3 黄占涛 SQL技术手册 2006-01-01 00:00:00.000

(6 行受影响)
*/

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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