SQL 求组

henbuxiaxin 2009-06-01 12:08:21
表A
Aid Cnt. qty Bid
1 1-12 11 1
1 13-15 11 1
2 18 12 1
2 19-20 10 2
3 22-24 12 2
3 25-30 10 2

表B
Bid name
1 A
2 B
3 C

按照表B的name,表A的Aid、qty分组

结果:
Aid name Cnt. qty totalqty
1 A 1-12,13-15 11 22
2 A 18 12 12
2 B 19-20 10 10
3 C 22-24 12 12
3 C 25-30 10 10

另:求得Cnt.后,如下1-12 为12 ,13-15 为3 (单数为1如18为1) 那么1-12,13-15为12+3=15
这样又该如何计算,求SQL 语句,谢谢大家。
...全文
144 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
henbuxiaxin 2009-06-01
  • 打赏
  • 举报
回复
结果中的Cnt.是表A中Cnt.连起来的
jiangshun 2009-06-01
  • 打赏
  • 举报
回复
看不懂Cnt.这个是怎么来的?
missilemy 2009-06-01
  • 打赏
  • 举报
回复
建议发贴的同时 ,发测试用的数据,以及你想要的结果
claro 2009-06-01
  • 打赏
  • 举报
回复
--SQL2000方法1
CREATE TABLE #A([Aid] INT,[Cnt.] VARCHAR(20),[qty] INT,[Bid] INT)
INSERT INTO #A
SELECT 1,'1-12',11,1 UNION ALL
SELECT 1,'13-15',11,1 UNION ALL
SELECT 2,'18',12,1 UNION ALL
SELECT 2,'19-20',10,2 UNION ALL
SELECT 3,'22-24',12,2 UNION ALL
SELECT 3,'25-30',10,2

CREATE TABLE #B([Bid] int,[name] varchar(20))
INSERT INTO #B
select 1,'A' union all
select 2,'B' union all
select 3,'C'

select a.Aid,[name]
,[Cnt.]=cast(min([Cnt.]) as varchar)
+case when count(1)=1 then '' else +','+cast(max([Cnt.]) as varchar) end ,qty,sum(qty) totalqty
from #A a
join #B b on a.Aid=b.Bid
group by a.Aid,[NAME],qty
ORDER BY 3
/*
Aid name Cnt. qty totalqty
1 A 1-12,13-15 11 22
2 B 18 12 12
2 B 19-20 10 10
3 C 22-24 12 12
3 C 25-30 10 10
*/
claro 2009-06-01
  • 打赏
  • 举报
回复
等不到来世 2009-06-01
  • 打赏
  • 举报
回复

--sql2005的解法
if object_id('[ta]') is not null drop table [ta]
go
create table [ta]([Aid] int,[Cnt] varchar(5),[qty] int,[Bid] int)
insert [ta]
select 1,'1-12',11,1 union all
select 1,'13-15',11,1 union all
select 2,'18',12,1 union all
select 2,'19-20',10,2 union all
select 3,'22-24',12,2 union all
select 3,'25-30',10,2
go
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([Bid] int,[name] varchar(1))
insert [tb]
select 1,'A' union all
select 2,'B' union all
select 3,'C'
go
--select * from [ta]
--select * from [tb]

select a.Aid,b.name
,Cnt=stuff((select ','+Cnt from ta where Aid=a.Aid and qty=a.qty and Bid=b.Bid for xml path('')),1,1,'')
,a.qty,totalqty=sum(a.qty)
from ta a join tb b
on a.Bid=b.Bid
group by a.Aid,a.qty,b.Bid,b.name
order by a.Aid,b.name,Cnt
/*
Aid name Cnt qty totalqty
----------- ---- --------------- ----------- -----------
1 A 1-12,13-15 11 22
2 A 18 12 12
2 B 19-20 10 10
3 B 22-24 12 12
3 B 25-30 10 10

(5 行受影响)
*/
SQL77 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 henbuxiaxin 的回复:]
c错了,应该是B
[/Quote]
SELECT AID,B.NAME,CNT,SUM(QTY)QTY FROM A,B WHERE A.BID=B.BID GROUP BY AID,QTY,CNT,B.NAME ORDER BY AID,B.NAME,QTY DESC

把条件改下!把AID改成BID
henbuxiaxin 2009-06-01
  • 打赏
  • 举报
回复
c错了,应该是B
henbuxiaxin 2009-06-01
  • 打赏
  • 举报
回复
取表A的aid ,表B的name,分组后的Cnt.的合并的,qty,sum(qty) 就这么个东西,怎么写
claro 2009-06-01
  • 打赏
  • 举报
回复
发类似贴的数据都有错,楼主们太粗心。
SQL77 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 henbuxiaxin 的回复:]
是a.bid=b.bid
[/Quote]
那你的结果怎么会有C呢??A.BID只有1,2呀
nalnait 2009-06-01
  • 打赏
  • 举报
回复

--try:
----------------------------------------------------------
CREATE FUNCTION getdata_uf
(
@var varchar(500)
)
RETURNS INT
AS
BEGIN
declare @m int,@y varchar(500),@i int,@j int
SET @m=0;
SET @i=0;
SET @j=0;

if(charindex('-',@var)=0)
begin
set @M=1;
RETURN @M
end
ELSE
BEGIN
SET @var=@var+','
while(charindex(',',@var)>0)
begin
SET @y=substring(@var,1,charindex(',',@var))
select @i=cast(substring(@y,1,charindex('-',@y)-1)as int)
select @j=cast(substring(@y,charindex('-',@y)+1,len(@y)-charindex('-',@y)-1) as int)
SET @m=@m+@j-@i+1
SET @var=substring(@var,charindex(',',@var)+1,len(@var))
end
END
-----------------------------------------------------------
RETURN @M
END

--------------------
DECLARE @M TABLE(AID INT,NAME VARCHAR(10),CNT VARCHAR(20),QTY INT,TOTALQTY INT)
INSERT INTO @M
SELECT 1,'A','1-12,13-15',11,22 UNION ALL
SELECT 2,'A','18',12,12 UNION ALL
SELECT 2,'B','19-20',10,10 UNION ALL
SELECT 3,'C','22-24',12,12 UNION ALL
SELECT 3,'C','25-30',10,10

SELECT *,DBO.getdata_uf(CNT)CNTT FROM @M
/*
AID NAME CNT QTY TOTALQTY CNTT
----------- ---------- -------------------- ----------- ----------- -----------
1 A 1-12,13-15 11 22 15
2 A 18 12 12 1
2 B 19-20 10 10 2
3 C 22-24 12 12 3
3 C 25-30 10 10 6

(5 行受影响)
*/


henbuxiaxin 2009-06-01
  • 打赏
  • 举报
回复
是a.bid=b.bid
SQL77 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 henbuxiaxin 的帖子:]
表A
Aid Cnt. qty Bid
1 1-12 11 1
1 13-15 11 1
2 18 12 1
2 19-20 10 2
3 22-24 12 2
3 25-30 10 2

表B
Bid name
1 A
2 B
3 C

按照表B的name,表A的Aid、qty分组

结果:
Aid name Cnt. qty totalqty
1 A 1-12,13-15 11 22
2 A 18 12 12
2 B 19-20 10 10
3 C 22-24…
[/Quote]

你的结果是怎么弄的呀??A.AID=B.BID??还是A.BID=B.BID??
SQL77 2009-06-01
  • 打赏
  • 举报
回复
稍微改下排序!
SELECT AID,B.NAME,CNT,SUM(QTY)QTY FROM A,B WHERE A.AID=B.BID GROUP BY AID,QTY,CNT,B.NAME ORDER BY AID,B.NAME,QTY DESC


AID NAME CNT QTY
----------- ---------- ---------- -----------
1 A 1-12,13-15 22
2 B 18 12
2 B 19-20 10
3 C 22-24 12
3 C 25-30 10

(所影响的行数为 5 行)

SQL77 2009-06-01
  • 打赏
  • 举报
回复
CREATE TABLE A(Aid INT, Cnt VARCHAR(10),  qty INT, Bid INT)
INSERT A
SELECT 1 , '1-12' , 11 , 1 UNION ALL
SELECT 1 , '13-15' , 11 , 1 UNION ALL
SELECT 2 , '18' , 12 , 1 UNION ALL
SELECT 2 , '19-20' , 10 , 2 UNION ALL
SELECT 3 , '22-24' , 12 , 2 UNION ALL
SELECT 3 , '25-30' , 10 , 2

CREATE TABLE B (Bid INT, name VARCHAR(10))
INSERT B
SELECT 1 , 'A' UNION
SELECT 2 , 'B' UNION
SELECT 3 , 'C'

--DROP TABLE B

--SELECT * FROM A
--SELECT * FROM B



SELECT DISTINCT A.AID,CNT INTO #TB FROM A ,
(SELECT AID,QTY FROM A WHERE NOT EXISTS (SELECT 1 FROM A T WHERE A.AID=T.AID AND A.QTY<>T.QTY ))AS T1
WHERE A.AID=T1.AID AND A.QTY=T1.QTY

DECLARE @STR VARCHAR(8000)
SELECT @STR=ISNULL(@STR+',','')+CNT
FROM #TB
SELECT @STR
UPDATE A SET CNT=@STR WHERE AID IN (SELECT AID FROM #TB)


SELECT AID,B.NAME,CNT,SUM(QTY)QTY FROM A,B WHERE A.AID=B.BID GROUP BY AID,QTY,CNT,B.NAME ORDER BY AID,B.NAME


AID NAME CNT QTY
----------- ---------- ---------- -----------
1 A 1-12,13-15 22
2 B 19-20 10
2 B 18 12
3 C 25-30 10
3 C 22-24 12

(所影响的行数为 5 行)

操作注意事项 用户在使用《房屋中介管理系统》之前,应注意以下事项: (1)实例执行文件路径:光盘\mingrisoft\房屋中介管理系统\houseAgency\houseAgency\bin\Debug\houseAgency.exe (2)本系统的初始用户名为“mr”,密码为“mrsoft”。 (3)在本系统中填写信息时,有时需要将五笔输入法的全角状态改为半角状态,否则程序可能会弹出错误提示,五笔输入法的全角状态和半角状态如图1.5所示。 图1.5 五笔输入法的全角与半角状态 (4)在“房源状态浏览”和“求租意向设置”模块中,输入完手机号后需要按一下回车键,才可执行相应的操作。 (5)在“求租意向设置”模块中设置完求租意向后,如果有匹配的房源信息,会提示找到相符信息,同样在录入房源时如果与某一求租意向匹配,也会提示找到相符信息。 (6)在使用“窗体局部”菜单中的功能时,需要打开两个模块,然后再执行即可看到设置效果。 (7)本程序中并没有直接提供修改房源信息的模块。在“求租管理”/“房源查询设置”模块中双击房源记录,弹出“房源设置”模块,在此模块中可以对房源信息进行修改。 (8)出租及预定的房源不可以进行修改。 (9)在“出租人员信息设置”模块中,录入完基本信息后,必须直接录入房源信息,否则此条出租人员信息无用处。 (10)在“录入员工信息”模块中添加完员工信息后,在“所有员工信息”模块中此员工的初始密码为“mrsoft”,如果想要修改密码,需要进行登录,然后选择“系统管理”/“口令设置”菜单项,对密码进行修改。

22,210

社区成员

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

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