一个多表求sum的sql语句

liyj19870228 2010-01-13 04:12:45
我对sql语句不是很在行 只会简单的select之类的语句,麻烦各位帮改一下下面的语句,执行效率高点的,因为关联表比较多,先麻烦大家 ,我不胜感激。
SELECT DISTINCT 
ZY_OA_AssignmentUsers.ContractID AS '合同编号', ZY_OA_ContractsInfo.PartyA AS '企业名称', ZY_OA_ProjectsCategory.ProjectsName AS '项目名称',
ZY_OA_AssignmentUsers.AddDatetime AS '日期', ZY_OA_AssignmentUsers.Certificate AS '凭证编号', ZY_OA_AssignmentUsers.Note AS '摘要',
ZY_OA_AssignmentUsers.GetAmount AS '贷方', ZY_OA_AddAmout.Amout-sum(ZY_OA_AssignmentUsers.GetAmount) AS '借方', ZY_OA_ContractsInfo.Amount AS '余额',
ZY_OA_UsersInfo.UserName AS '收款人'
FROM ZY_OA_AssignmentUsers INNER JOIN
ZY_OA_ProjectsCategory ON ZY_OA_AssignmentUsers.TypeID = ZY_OA_ProjectsCategory.ID INNER JOIN
ZY_OA_ContractsInfo ON ZY_OA_AssignmentUsers.ContractID = ZY_OA_ContractsInfo.ContractID INNER JOIN
ZY_OA_UsersInfo ON ZY_OA_AssignmentUsers.UID = ZY_OA_UsersInfo.UID INNER JOIN
ZY_OA_AddAmout ON ZY_OA_AssignmentUsers.AddObjectID = ZY_OA_AddAmout.ID

执行的时候这句话会错 ZY_OA_AddAmout.Amout-sum(ZY_OA_AssignmentUsers.GetAmount) AS '借方', ZY_OA_ContractsInfo.Amount AS '余额',
怎么回事?
主要问题就在于求这个余额 麻烦大家了 在线的
...全文
533 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞鸟冬天 2010-03-23
  • 打赏
  • 举报
回复
学习 了。看看先,刚好有个类似的。
qizhengsheng 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sql77 的回复:]
引用 9 楼 liyj19870228 的回复:
消息 8155,级别 16,状态 2,第 1 行
没有为 'e' 的列 2 指定任何列。
消息 207,级别 16,状态 1,第 4 行
列名 'Amout' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'GetAmount' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'Amount' 无效。

提示。。。

类似做法,你先把要SUM的按你的字段分组求和,再用连接查询
[/Quote]

同意
先分组刷选在连接
liyj19870228 2010-01-14
  • 打赏
  • 举报
回复
SELECT DISTINCT
a.ID, a.ContractID AS '合同编号', c.PartyA AS '企业名称', b.ProjectsName AS '项目名称',
a.AddDatetime AS '日期', a.[Certificate] AS '凭证编号', a.Note AS '摘要',
a.GetAmount AS '贷方', c.Amount AS '借方',c.Amount-e.GetAmout AS '余额',
d.UserName AS '收款人'
FROM
ZY_OA_AssignmentUsers a
INNER JOIN
ZY_OA_ProjectsCategory b ON a.TypeID = b.ID
INNER JOIN
ZY_OA_ContractsInfo c ON a.ContractID = c.ContractID
INNER JOIN
ZY_OA_UsersInfo d ON a.UID = d.UID
INNER JOIN
(select e.id,sum(e.GetAmount) as GetAmout from ZY_OA_AssignmentUsers e group by e.id)e
ON
a.ID = e.ID

这里有点问题INNER JOIN
(select e.id,sum(e.GetAmount) as GetAmout from ZY_OA_AssignmentUsers e group by e.id)e
ON
a.ID = e.ID
要统计出
sum(e.GetAmount)
liyj19870228 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fredrickhu 的回复:]
SQL code---trySELECTDISTINCT
a.ContractIDAS'合同编号', c.PartyAAS'企业名称', b.ProjectsNameAS'项目名称',
a.AddDatetimeAS'日期', a.CertificateAS'凭证编号', a.NoteAS'摘要',
a.GetAmountAS'贷方', e.Amout-e.Get?-
[/Quote]

有点问题,这个sum只统计了第一条和最后条数据,其他数据都没统计的 怎么改呢 我琢磨了好久 都没成功
SQL77 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 liyj19870228 的回复:]
引用 11 楼 sql77 的回复:
引用 9 楼 liyj19870228 的回复:
消息 8155,级别 16,状态 2,第 1 行
没有为 'e' 的列 2 指定任何列。
消息 207,级别 16,状态 1,第 4 行
列名 'Amout' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'GetAmount' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'Amount' 无效。

提示。。。

类似做法,你先把要SUM的按你的字段分组求和,再用连接查询



恩 好的 我已经在测了,看懂了你的写法了,谢谢了,不过冒昧问下,这样的效率还行的么 比如有几万条数据的话
[/Quote]
连接查询,加上相应索引,几万条没问题
liyj19870228 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sql77 的回复:]
引用 9 楼 liyj19870228 的回复:
消息 8155,级别 16,状态 2,第 1 行
没有为 'e' 的列 2 指定任何列。
消息 207,级别 16,状态 1,第 4 行
列名 'Amout' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'GetAmount' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'Amount' 无效。

提示。。。

类似做法,你先把要SUM的按你的字段分组求和,再用连接查询
[/Quote]


恩 好的 我已经在测了,看懂了你的写法了,谢谢了,不过冒昧问下,这样的效率还行的么 比如有几万条数据的话
SQL77 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liyj19870228 的回复:]
消息 8155,级别 16,状态 2,第 1 行
没有为 'e' 的列 2 指定任何列。
消息 207,级别 16,状态 1,第 4 行
列名 'Amout' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'GetAmount' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'Amount' 无效。

提示。。。
[/Quote]
类似做法,你先把要SUM的按你的字段分组求和,再用连接查询
--小F-- 2010-01-13
  • 打赏
  • 举报
回复
SELECT DISTINCT 
a.ContractID AS '合同编号', c.PartyA AS '企业名称', b.ProjectsName AS '项目名称',
a.AddDatetime AS '日期', a.Certificate AS '凭证编号', a.Note AS '摘要',
a.GetAmount AS '贷方', e.Amout-e.GetAmout AS '借方', b.Amount AS '余额',
d.UserName AS '收款人'
FROM
ZY_OA_AssignmentUsers a
INNER JOIN
ZY_OA_ProjectsCategory b ON a.TypeID = b.ID
INNER JOIN
ZY_OA_ContractsInfo c ON a.ContractID = c.ContractID
INNER JOIN
ZY_OA_UsersInfo d ON a.UID = d.UID
INNER JOIN
(select e.id,sum(a.GetAmout) as GetAmout,e.amout from ZY_OA_AssignmentUsers a,ZY_OA_AddAmout e where a.AddObjectID = e.ID group by e.id,e.amout)e
ON
a.AddObjectID = e.ID
liyj19870228 2010-01-13
  • 打赏
  • 举报
回复
消息 8155,级别 16,状态 2,第 1 行
没有为 'e' 的列 2 指定任何列。
消息 207,级别 16,状态 1,第 4 行
列名 'Amout' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'GetAmount' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'Amount' 无效。

提示。。。
liyj19870228 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fredrickhu 的回复:]
SQL code--修改SELECTDISTINCT
a.ContractIDAS'合同编号', c.PartyAAS'企业名称', b.ProjectsNameAS'项目名称',
a.AddDatetimeAS'日期', a.CertificateAS'凭证编号', a.NoteAS'摘要',
a.GetAmountAS'贷方', e.Amout-e.GetAm?-
[/Quote]

谢谢 我先试试
starseeker7 2010-01-13
  • 打赏
  • 举报
回复
看你到底要sum多少ZY_OA_AssignmentUsers
根據條件不同去增加
AU1 表内group 和sum,前面的字段吧
當然外面的on 的條件也要對應 增加
--小F-- 2010-01-13
  • 打赏
  • 举报
回复
--修改
SELECT DISTINCT
a.ContractID AS '合同编号', c.PartyA AS '企业名称', b.ProjectsName AS '项目名称',
a.AddDatetime AS '日期', a.Certificate AS '凭证编号', a.Note AS '摘要',
a.GetAmount AS '贷方', e.Amout-e.GetAmount AS '借方', b.Amount AS '余额',
d.UserName AS '收款人'
FROM
ZY_OA_AssignmentUsers a
INNER JOIN
ZY_OA_ProjectsCategory b ON a.TypeID = b.ID
INNER JOIN
ZY_OA_ContractsInfo c ON a.ContractID = c.ContractID
INNER JOIN
ZY_OA_UsersInfo d ON a.UID = d.UID
INNER JOIN
(select e.id,sum(a.GetAmount) from ZY_OA_AssignmentUsers a,ZY_OA_AddAmout e where a.AddObjectID = e.ID group by e.id)e
ON
a.AddObjectID = e.ID
--小F-- 2010-01-13
  • 打赏
  • 举报
回复
---try
SELECT DISTINCT
a.ContractID AS '合同编号', c.PartyA AS '企业名称', b.ProjectsName AS '项目名称',
a.AddDatetime AS '日期', a.Certificate AS '凭证编号', a.Note AS '摘要',
a.GetAmount AS '贷方', e.Amout-e.GetAmount AS '借方', b.Amount AS '余额',
d.UserName AS '收款人'
FROM
ZY_OA_AssignmentUsers a
INNER JOIN
ZY_OA_ProjectsCategory b ON a.TypeID = b.ID
INNER JOIN
ZY_OA_ContractsInfo c ON a.ContractID = c.ContractID
INNER JOIN
ZY_OA_UsersInfo d ON a.UID = d.UID
INNER JOIN
(select e.id,sum(a.GetAmount) from ZY_OA_AssignmentUsers a,ZY_OA_AddAmout e where a.AddObjectID = e.ID)e
ON
a.AddObjectID = e.ID
starseeker7 2010-01-13
  • 打赏
  • 举报
回复
SELECT DISTINCT
ZY_OA_AssignmentUsers.ContractID AS '合同编号', ZY_OA_ContractsInfo.PartyA AS '企业名称', ZY_OA_ProjectsCategory.ProjectsName AS '项目名称',
ZY_OA_AssignmentUsers.AddDatetime AS '日期', ZY_OA_AssignmentUsers.Certificate AS '凭证编号', ZY_OA_AssignmentUsers.Note AS '摘要',
ZY_OA_AssignmentUsers.GetAmount AS '贷方', ZY_OA_AddAmout.Amout-AU1.GetAmount AS '借方', ZY_OA_ContractsInfo.Amount AS '余额',
ZY_OA_UsersInfo.UserName AS '收款人'
FROM ZY_OA_AssignmentUsers INNER JOIN
(
select ContractID,sum(GetAmount) as from ZY_OA_AssignmentUsers group by ContractID
) as AU1 on ZY_OA_AssignmentUsers.ContractID = AU1.ContractID INNER JOIN
ZY_OA_ProjectsCategory ON ZY_OA_AssignmentUsers.TypeID = ZY_OA_ProjectsCategory.ID INNER JOIN
ZY_OA_ContractsInfo ON ZY_OA_AssignmentUsers.ContractID = ZY_OA_ContractsInfo.ContractID INNER JOIN
ZY_OA_UsersInfo ON ZY_OA_AssignmentUsers.UID = ZY_OA_UsersInfo.UID INNER JOIN
ZY_OA_AddAmout ON ZY_OA_AssignmentUsers.AddObjectID = ZY_OA_AddAmout.ID
liyj19870228 2010-01-13
  • 打赏
  • 举报
回复
SELECT DISTINCT 
ZY_OA_AssignmentUsers.ContractID AS '合同编号', ZY_OA_ProjectsCategory.ProjectsName AS '项目名称',
ZY_OA_AssignmentUsers.AddDatetime AS '日期', ZY_OA_AssignmentUsers.Certificate AS '凭证编号', ZY_OA_AssignmentUsers.Note AS '摘要',
ZY_OA_AssignmentUsers.GetAmount AS '贷方', sum(ZY_OA_AssignmentUsers.GetAmount) AS '借方',ZY_OA_ContractsInfo.Amount-sum(ZY_OA_AssignmentUsers.GetAmount) AS '余额',
ZY_OA_UsersInfo.UserName AS '收款人'
FROM ZY_OA_AssignmentUsers INNER JOIN
ZY_OA_ProjectsCategory ON ZY_OA_AssignmentUsers.TypeID = ZY_OA_ProjectsCategory.ID INNER JOIN
ZY_OA_ContractsInfo ON ZY_OA_AssignmentUsers.ContractID = ZY_OA_ContractsInfo.ContractID INNER JOIN
ZY_OA_UsersInfo ON ZY_OA_AssignmentUsers.UID = ZY_OA_UsersInfo.UID INNER JOIN
ZY_OA_AddAmout ON ZY_OA_AssignmentUsers.AddObjectID = ZY_OA_AddAmout.ID
GROUP BY ZY_OA_AssignmentUsers.ContractID,ZY_OA_ProjectsCategory.ProjectsName,ZY_OA_AssignmentUsers.AddDatetime,ZY_OA_AssignmentUsers.AddDatetime,ZY_OA_AssignmentUsers.[Certificate],ZY_OA_AssignmentUsers.Note,ZY_OA_AssignmentUsers.GetAmount,ZY_OA_ContractsInfo.Amount,ZY_OA_UsersInfo.UserName



我重新写了一下,发现没有形成预期的效果, ZY_OA_ContractsInfo.Amount-sum(ZY_OA_AssignmentUsers.GetAmount) AS '余额', 这句话 只是简单的执行 ZY_OA_ContractsInfo.Amount-ZY_OA_AssignmentUsers.GetAmount,而不是执行ZY_OA_ContractsInfo.Amount-总额

怎么改呢
liyj19870228 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 loveyang7733 的回复:]
SQL codesum(ZY_OA_AddAmout.Amout-ZY_OA_AssignmentUsers.GetAmount)AS'借方'
[/Quote]

ZY_OA_AddAmout.Amout 这个是总额,要减去 ZY_OA_AssignmentUsers.GetAmount这个的所有数据的总和的
低调的感觉 2010-01-13
  • 打赏
  • 举报
回复
sum(ZY_OA_AddAmout.Amout-ZY_OA_AssignmentUsers.GetAmount) AS '借方'

34,874

社区成员

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

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