请教用GroupBy分组后,如何与其他几个表连接的问题

tossgoon 2010-10-03 10:16:28
三个表:供应商,表单,记录,例如:
供应商:
供应商ID, 供应商Name
1 , AAA
2 , BBB
... ...

表单:
表单ID,供应商ID
1 , 1
2 , 1
3 , 2
... ...
记录:
记录ID,表单ID, 金额
1 , 1 , 100
2 , 2 , 200
3 , 1 , 500
4 , 3 , 200
5 , 1 , 500

现在想得到每个表单的供应商Name及总金额,如下:

表单ID,供应商Name,总金额
1 ,AAA ,1100
2 ,AAA ,500
... ... ....
我现在用的是:
SELECT 表单ID, SUM(记录.金额)
FROM 记录
Group By 表单ID
这样当然只能得到每个ID对应的总金额,但却无法得到每个ID对应的供应商Name。

如果直接写成:
SELECT 表单.表单ID, 供应商.供应商Name, SUM(记录.金额)
FROM 表单,记录,供应商
WHERE 表单.供应商ID=供应商.供应商ID
Group By 表单ID

会出错,我知道为什么出错。可怎样如何把两个表连接起来,同时还要有group by进行分组呢?


我觉得这个问题应该有人问过吧,查了一下没查到,所以发上来问问大家。谢谢!





...全文
350 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
abuying 2010-10-04
  • 打赏
  • 举报
回复
参考以下例子 ,自己做的。只是表名不同,结构是相 同的
问题说明:有三个表,项目表、合同表、付款表
一个项目可能会有签署多个合同,每个合同会分几次付款。

--下面是建立表的语句
create table 项目(项目编号 int,项目名称 varchar(50))
insert 项目
select 1, '项目1'
union
select 2, '项目2'
union
select 3, '项目3'


create table 合同(合同编号 int,项目编号 int,合同金额 numeric(7,3))

insert 合同
select 1,1,1000
union
select 2,1,1500
union
select 3,2,2000

create table 付款(付款编号 int,合同编号 int,付款金额 numeric(7,3))

insert 付款
select 1,1,100
union
select 2,2,200
union
select 3,2,800

问题(一):
设计一个查询,要求返回结果如下:
----------------------------------------------------------
项目编号 项目名称 项目所有合同的金额
----------- ------------------------ ---------------------
1 项目1 2500
2 项目2 2000
3 项目3 NULL


问题(二):
设计一个查询,要求返回结果如下:
--------------------------------------
项目编号 项目所有合同已付款金额
----------- --------------------------
1 1100
2 NULL
--------------------------------------

问题(三)
设计一个查询,要求返回结果如下:
项目编号 项目名称 项目所有合同已付款金额
----------- ----------------------------------------
1 项目1 1100
2 项目2 NULL
----------------------------------------------------

问题(四):
请您设计一个查询语句,检索的格式如下:
------------------------------------------------------------------------
项目编号 项目名称 项目所有合同的金额 项目所有合同已付款金额
------------------------------------------------------------------------
1 项目1 2500.000 1100.000
2 项目2 2000.000 NULL
------------------------------------------------------------------------

考核点:问题一、二、三考核连接、分组统计的综合运用
问题四考核连接、分组统计、子查询的综合运用

--1 select a.*,项目所有合同的金额 from dbo.项目 as a inner join (select 项目编号,sum(合同金额) 项目所有合同的金额 from 合同 group by 项目编号) b on a.项目编号=b.项目编号
--2 select a.项目编号,sum(付款金额) 项目所有合同金额 from dbo.合同 a left join dbo.付款 b on a.合同编号=b.合同编号 group by a.项目编号
--3 select e.项目编号,e.项目名称,d.项目所有合同已付款金额 from (select a.项目编号,sum(付款金额) 项目所有合同已付款金额 from dbo.合同 a left join dbo.付款 b on a.合同编号=b.合同编号 group by a.项目编号) as d inner join dbo.项目 e on d.项目编号=e.项目编号
--4 select e.项目编号,e.项目名称,d.项目所有合同已付款金额,f.项目所有合同的金额 from (select a.项目编号,sum(付款金额) 项目所有合同已付款金额 from dbo.合同 a left join dbo.付款 b on a.合同编号=b.合同编号 group by a.项目编号) as d inner join dbo.项目 e on d.项目编号=e.项目编号 inner join (select a.*,项目所有合同的金额 from dbo.项目 as a inner join (select 项目编号,sum(合同金额) 项目所有合同的金额 from 合同 group by 项目编号) b on a.项目编号=b.项目编号) f on d.项目编号=f.项目编号 -
「已注销」 2010-10-03
  • 打赏
  • 举报
回复
6#的还是有点问题,LZ可以参考着改改把多于的null部分处理掉就可以了。
ws_hgo 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zsh0809 的回复:]
引用 7 楼 ws_hgo 的回复:

引用 6 楼 zsh0809 的回复:
SQL code
CREATE TABLE Vendor
(
VendorID int identity,
VendorName VARCHAR(20)
)
GO
CREATE TABLE List
(
ListID int identity,
VendorID int
)
GO
CRE……
[/Quote]

呵呵
继续努力
「已注销」 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ws_hgo 的回复:]

引用 6 楼 zsh0809 的回复:
SQL code
CREATE TABLE Vendor
(
VendorID int identity,
VendorName VARCHAR(20)
)
GO
CREATE TABLE List
(
ListID int identity,
VendorID int
)
GO
CREATE TABLE Record
……
……
[/Quote]
学习为主,抢分老被你抢我前面,我现在不敢抢了。
ws_hgo 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zsh0809 的回复:]
SQL code
CREATE TABLE Vendor
(
VendorID int identity,
VendorName VARCHAR(20)
)
GO
CREATE TABLE List
(
ListID int identity,
VendorID int
)
GO
CREATE TABLE Record
……
[/Quote]

还在抢分啊
「已注销」 2010-10-03
  • 打赏
  • 举报
回复
CREATE TABLE Vendor
(
VendorID int identity,
VendorName VARCHAR(20)
)
GO
CREATE TABLE List
(
ListID int identity,
VendorID int
)
GO
CREATE TABLE Record
(
RecordID int identity,
ListID int,
[Money] int
)
GO
INSERT INTO Vendor select 'Huawei'
INSERT INTO Vendor select 'IBM'
INSERT INTO Vendor select 'Google'

INSERT INTO List select 1
INSERT INTO List select 2
INSERT INTO List SELECT 3

INSERT INTO Record SELECT 1,200
INSERT INTO Record SELECT 2,300
INSERT INTO Record SELECT 3,400

SELECT DISTINCT L.ListID,V.VendorNAME,R.MONEY
FROM Vendor v,LIST L
LEFT JOIN
(
SELECT r.ListID, SUM(R.[Money])OVER(PARTITION BY R.ListID) [MONEY]
FROM Record r
)R
ON R.ListID=L.ListID
WHERE V.VendorID=L.VendorID
ORDER BY L.ListID


ListID VendorNAME MONEY
----------- -------------------- -----------
1 Huawei 200
2 IBM 300
3 Google 400

(3 row(s) affected)
tossgoon 2010-10-03
  • 打赏
  • 举报
回复
楼上的那样写好像不行吧,比如只有2个供应商,却有10个单子,那么按:

Group By 表单.表单ID,供应商.供应商Name
进行分组,

最后是不是只得到两行?
SQL77 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sql77 的回复:]
SQL code
SELECT 表单.表单ID, 供应商.供应商Name, SUM(记录.金额)
FROM 表单,记录,供应商
WHERE 表单.供应商ID=供应商.供应商ID AND 记录.表单ID=表单.表单ID
Group By 表单ID,供应商.供应商Name
[/Quote]

SELECT 表单.表单ID, 供应商.供应商Name, SUM(记录.金额)
FROM 表单,记录,供应商
WHERE 表单.供应商ID=供应商.供应商ID AND 记录.表单ID=表单.表单ID
Group By 表单.表单ID,供应商.供应商Name
SQL77 2010-10-03
  • 打赏
  • 举报
回复
SELECT 表单.表单ID, 供应商.供应商Name, SUM(记录.金额)
FROM 表单,记录,供应商
WHERE 表单.供应商ID=供应商.供应商ID AND 记录.表单ID=表单.表单ID
Group By 表单ID,供应商.供应商Name
tossgoon 2010-10-03
  • 打赏
  • 举报
回复
我不会发图片。。。。。
想得到的效果如下:

表单ID, 供应商Name, 总金额
1 , AAA , 1100
2 , AAA , 500
3, BBB, 400

得到每一个表单的总金额数,及每一个表单的供应商Name,需要三个表进行连接。
1、表“供应商”提供供应商Name,及供应商ID;
2、表“表单”提供表单ID,及对应的供应商ID;
3、表“记录”提供表单ID,及每个表单的金额(表单可以重复)

简单说吧,用group by进行分组后,如何与其他表进行连接。
谢谢!
「已注销」 2010-10-03
  • 打赏
  • 举报
回复
贴出测试数据,及期望的正确结果,谢谢。

34,576

社区成员

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

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