三个表:供应商,表单,记录,例如:
供应商:
供应商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进行分组呢?
我觉得这个问题应该有人问过吧,查了一下没查到,所以发上来问问大家。谢谢!
供应商:
供应商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进行分组呢?
我觉得这个问题应该有人问过吧,查了一下没查到,所以发上来问问大家。谢谢!
解决方案 »
- 帮我看看数据库的性能
- sql2008怎么判断同步后的两个数据库数据是否完全一致
- 数据库不进行分离操作,可以正常地进行附加吗?
- 怎么用VB获得数据库表的字段个数和各字段的字段名(包括无记录的表和有记录的表)?
- 我用delete from ... where ....删除了一百多条记录,如何恢复
- 查询后怎么获取序列?
- SP里调用SP,导致Tempdb的LOG文件疯狂的往上涨 ---》在线等待
- 怎么判断一个表的字段里的内容有没有在另外一个表的字段内容中出现过
- 关于数据库性能
- 比较难问题,在SQL SERVER存储过程中怎么做到这种效果??高手进呀进
- 问一个sql查询,如何给查询结果加上序号?
- 帮忙修改或写一条sql语句
想得到的效果如下:
表单ID, 供应商Name, 总金额
1 , AAA , 1100
2 , AAA , 500
3, BBB, 400 得到每一个表单的总金额数,及每一个表单的供应商Name,需要三个表进行连接。
1、表“供应商”提供供应商Name,及供应商ID;
2、表“表单”提供表单ID,及对应的供应商ID;
3、表“记录”提供表单ID,及每个表单的金额(表单可以重复) 简单说吧,用group by进行分组后,如何与其他表进行连接。
谢谢!
FROM 表单,记录,供应商
WHERE 表单.供应商ID=供应商.供应商ID AND 记录.表单ID=表单.表单ID
Group By 表单ID,供应商.供应商Name
SELECT 表单.表单ID, 供应商.供应商Name, SUM(记录.金额)
FROM 表单,记录,供应商
WHERE 表单.供应商ID=供应商.供应商ID AND 记录.表单ID=表单.表单ID
Group By 表单.表单ID,供应商.供应商Name
进行分组,最后是不是只得到两行?
(
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 3INSERT INTO Record SELECT 1,200
INSERT INTO Record SELECT 2,300
INSERT INTO Record SELECT 3,400SELECT 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)
问题说明:有三个表,项目表、合同表、付款表
一个项目可能会有签署多个合同,每个合同会分几次付款。--下面是建立表的语句
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,2000create 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.项目编号 -