SQL特定代码花费的总和金额

问题描述 投票:0回答:4

我有一张表格列出了所有供应商以及我付款的时间。我想估算每个供应商支付的总金额。目前,特定供应商可能有25行,在不同日期支付不同金额。我只想为每个vendor_code,供应商名称以及支付给他们的总金额显示一行。

到目前为止我有这个:

select s.vendor_code, 
       a.address_name, 
       a.addr2, a.addr3, 
       a.city, a.state, 
       a.postal_code, a.vend_class_code, 
       date_applied, SUM(amt_net) as 'Total'
from appyhdr_all s, apmaster a
where s.vendor_code = a.vendor_code
  and s.pay_to_code = a.pay_to_code
  and void_flag=0
  and s.payment_type <> 4

目前,我收到此错误:Column 'appyhdr_all.vendor_code' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

sql sql-server
4个回答
2
投票

这应该工作:

select s.vendor_code 
       , a.address_name 
       , a.addr2
       , a.addr3 
       , a.city
       , a.state 
       , a.postal_code
       , a.vend_class_code 
       , SUM(amt_net) as 'Total'
from    appyhdr_all s
join    apmaster a
        on s.vendor_code = a.vendor_code
where   1 = 1
    and s.pay_to_code = a.pay_to_code
    and void_flag=0
    and s.payment_type <> 4
group 
by      s.vendor_code 
       , a.address_name 
       , a.addr2
       , a.addr3 
       , a.city
       , a.state 
       , a.postal_code
       , a.vend_class_code

0
投票

在使用聚合函数时:

SUM(amt_net)为'Total'

确保列出现在GROUP BY子句中


0
投票

首先尝试更简单的事情。如果appyhdr_all s是供应商,这应该工作。

select s.vendor_code, 
       SUM(amt_net) as 'Total'
from appyhdr_all s
inner join apmaster a
    on s.vendor_code = a.vendor_code
   and s.pay_to_code = a.pay_to_code
where void_flag=0
and s.payment_type <> 4
group by s.vendor_code

0
投票

是的,您应该包含一个group by子句并将所有选定的非聚合属性放在那里:

select s.vendor_code, 
       a.address_name, 
       a.addr2, a.addr3, 
       a.city, a.state, 
       a.postal_code, a.vend_class_code, 
       date_applied, SUM(amt_net) as 'Total'
from appyhdr_all s, apmaster a
where s.vendor_code = a.vendor_code
  and s.pay_to_code = a.pay_to_code
  and void_flag=0
  and s.payment_type <> 4
group by s.vendor_code,       --<--here it is 
       a.address_name, 
       a.addr2, a.addr3, 
       a.city, a.state, 
       a.postal_code, a.vend_class_code, 
       date_applied

顺便说一下,您可能想要移动最新的连接语法:

...
from appyhdr_all s
inner join apmaster a
    on s.vendor_code = a.vendor_code
   and s.pay_to_code = a.pay_to_code
where void_flag=0
...

编辑到期OP评论:

“当我实现它时,我仍然会获得相同供应商代码的多行。”

这意味着每个供应商的apmaster上都有几行。你必须决定你为每个供应商采取的女巫apmaster行。这是每个供应商的总数:

with total_by_vendor as (
 select s.vendor_code, SUM(amt_net) as 'Total'
 from appyhdr_all s inner join apmaster a
    on s.vendor_code = a.vendor_code
   and s.pay_to_code = a.pay_to_code
 where void_flag=0
   and s.payment_type <> 4
 group by s.vendor_code
)
select *
from total_by_vendor;

只需加入apmaster的最新数据:

with total_by_vendor as (
 select s.vendor_code, SUM(amt_net) as 'Total'
 from appyhdr_all s inner join apmaster a
    on s.vendor_code = a.vendor_code
   and s.pay_to_code = a.pay_to_code
 where void_flag=0
   and s.payment_type <> 4
 group by s.vendor_code
),
recent_apmaster as (
 select vendor_code, a.address_name, 
       a.addr2, a.addr3, 
       a.city, a.state, 
       a.postal_code, a.vend_class_code,
       row_number() OVER ( PARTITION BY vendor_code 
                           ORDER BY a.address_name desc ) --put here criteria
       as n
 from apmaster a
)
select *
from total_by_vendor T inner join recent_apmaster a
  on T.vendor_code = a.vendor_code
where n = 1;
© www.soinside.com 2019 - 2024. All rights reserved.