有如下数据,实际数据为上万条
门店ID 商品ID 库存数量
1 11 10
2 11 20
3 11 30
4 11 40
5 11 50
1 12 100
2 12 100
3 12 20
4 12 30
1 13 40
2 13 4
3 13 50
1 14 40
2 14 4数据库为sql server2000或2008
希望得到,每个商品库存数量最大的三个门店以内的数据
结果1:
门店ID 商品ID 库存数量
3 11 30
4 11 40
5 11 50
1 12 100
2 12 100
4 12 30
1 13 40
2 13 4
3 13 50
1 14 40
2 14 4还有一种结果是,在结果1的基础,将同一商品多个门店ID转换为一行显示,并合计库存数量
如结果2:
门店ID 商品ID 库存数量
3 4 5 11 120
1 2 4 12 230
1 2 3 13 94
1 2 14 44
门店ID 商品ID 库存数量
1 11 10
2 11 20
3 11 30
4 11 40
5 11 50
1 12 100
2 12 100
3 12 20
4 12 30
1 13 40
2 13 4
3 13 50
1 14 40
2 14 4数据库为sql server2000或2008
希望得到,每个商品库存数量最大的三个门店以内的数据
结果1:
门店ID 商品ID 库存数量
3 11 30
4 11 40
5 11 50
1 12 100
2 12 100
4 12 30
1 13 40
2 13 4
3 13 50
1 14 40
2 14 4还有一种结果是,在结果1的基础,将同一商品多个门店ID转换为一行显示,并合计库存数量
如结果2:
门店ID 商品ID 库存数量
3 4 5 11 120
1 2 4 12 230
1 2 3 13 94
1 2 14 44
解决方案 »
- 为什么提示:对象名 'person.Contact' 无效?
- 求教SQL SERVER使用存储过程分页的问题,请各位不惜指教。
- 如何实现自动增加
- 救急!连接sql2000时,连上的端口有些是1433(sql2000的默认端口),有些是139,445的端口,很郁闷啊
- 在7.0版本附加数据库的时候出现的i/o问题?奇怪?
- 求一SQL语句
- 江湖救急!!!对于200多个字段的表,如何使访问速度提高???
- 新手问向一个表中插入结果集问题。着急啊
- 如何在一张表中分人员取得与当前时间最近的一条数据?sql
- 插入字符串时,如何让字符串中包含引号?
- sql查询
- 急~关于SQL连结的伺服器如何增加一个提供者 informix
--第一个
with tb(a,b,c)as(
select 1,11,10 union all
select 2,11,20 union all
select 3,11,30 union all
select 4,11,40 union all
select 5,11,50 union all
select 1,12,100 union all
select 2,12,100 union all
select 3,12,20 union all
select 4,12,30 union all
select 1,13,40 union all
select 2,13,4 union all
select 3,13,50 union all
select 1,14,40 union all
select 2,14,4 )
,tc as (select *,num=ROW_NUMBER() over(partition by b order by c desc) from tb)
select a,b,c from tc
where num<=3
order by b,a
--第二个
with tb(a,b,c)as(
select 1,11,10 union all
select 2,11,20 union all
select 3,11,30 union all
select 4,11,40 union all
select 5,11,50 union all
select 1,12,100 union all
select 2,12,100 union all
select 3,12,20 union all
select 4,12,30 union all
select 1,13,40 union all
select 2,13,4 union all
select 3,13,50 union all
select 1,14,40 union all
select 2,14,4 )
,tc as (select *,num=ROW_NUMBER() over(partition by b order by c desc) from tb)
select (select ' '+convert(varchar,a) from tc
where a.b=b and num<=3 order by a for xml path('')),b,sum(c) from tc a
where num<=3
group by b
--SQL2000方法
--门店ID,商品ID,库存数量,自增ID
CREATE TABLE #cu1 (MD_ID INT,SP_ID INT,END_QTY INT,ID INT IDENTITY(1,1))
CREATE TABLE #cu2 (MD_ID INT,SP_ID INT,END_QTY INT)
CREATE TABLE #cu3 (MD_ID VARCHAR(100),SP_ID INT,END_QTY INT,ID INT IDENTITY(1,1))INSERT INTO #CU1(MD_ID,SP_ID,END_QTY)
SELECT 1, 11, 10 UNION ALL
SELECT 2, 11, 20 UNION ALL
SELECT 3, 11, 30 UNION ALL
SELECT 4, 11, 40 UNION ALL
SELECT 5, 11, 50 UNION ALL
SELECT 1, 12, 100 UNION ALL
SELECT 2, 12, 100 UNION ALL
SELECT 3, 12, 20 UNION ALL
SELECT 4, 12, 30 UNION ALL
SELECT 1, 13, 40 UNION ALL
SELECT 2, 13, 4 UNION ALL
SELECT 3, 13, 50 UNION ALL
SELECT 1, 14, 40 UNION ALL
SELECT 2, 14, 4insert INTO #cu2
SELECT MD_ID,SP_ID,END_QTY FROM #cu1 a
WHERE id IN (SELECT TOP 3 id FROM #cu1 WHERE sp_id=a.sp_id ORDER BY end_qty DESC)
ORDER BY sp_id,md_idinsert INTO #cu3 (SP_ID,END_QTY)
SELECT SP_ID,SUM(END_QTY) FROM #cu2 GROUP BY SP_IDDECLARE @md_id VARCHAR(100),@i1 INT,@i2 INT
SELECT @i1=1,@i2=MAX(id) FROM #cu3
WHILE @i1<=@i2
BEGIN
SET @md_id=''
SELECT @md_id=@md_id+CASE WHEN @md_id='' THEN '' ELSE ',' end+RTRIM(md_id)
FROM #cu2 WHERE sp_id=(SELECT sp_id FROM #cu3 WHERE id=@i1)
UPDATE #cu3 SET md_id=@md_id WHERE id=@i1
SET @i1=@i1+1
END--結果一
SELECT * FROM #cu2
--結果二
SELECT * FROM #cu3