2014-10-02 50 views
-1

我试图得到一个平均添加多个行条目,然后将SQL

我有如下表:

| ClientName | MemberName | TotalAmountSpent | PercentAmountSpent| 
|-----Palace--- |---------John---- |-----------376.26------ |------------???------------ | 
|-----Palace--- |--------Adem---- |-----------646.83------ |------------???------------ | 
|----Pizzeria--- |---------Zoey----- |-----------10.00-------- |------------???------------ | 

这是我到目前为止有:

SELECT c.ClientName 
     ,m.Mem_Name  


     ,Sum(mv.AmountSpent) as TotalAmountSpent 
     ,Sum(mv.AmountSpent)/ *100 as PercentAmountSpent 


FROM Client c 

JOIN MemberVisits mv 
On c.ClientId = mv.RestaurantId 
JOIN Member m 
On m.Mem_ID = mv.MemberId 

GROUP by ClientName, m.Mem_Name 

ORDER by ClientName 

的公式是:(Total Amount Spent/total business sales) * 100

例如:johns percentamountspent应该是(376.26/ (376.26 + 646.83)) * 100

我该如何解决这一行Sum(mv.AmountSpent)/ /*Something here */ *100 as PercentAmountSpent以获得正确的输出?

感谢

+1

不可能与一个查询。直到扫描完所有行后,“总业务销售额”才可用,并且您试图在每行计算中使用该总额。你将不得不使用子查询来获得总数。 – 2014-10-02 14:52:24

回答

0

您可以使用子查询(以避免在计算多个SUM),而在另一子查询内部联接以获得totalBusinessSales(其看起来像RestaurantId的amountSpent的总和)

select 
    ClientName 
    MemName, 
    totalAmountSpent, 
    sumAmountSpent/totalBusinessSales * 100 as percentAmountSpent 
    from 

    (select c.ClientName, 
      m.Mem_Name, 
      sum(mv.AmountSpent) as totalAmountSpent, 
      sum(s.TotalBusinessSales) as totalBusinessSales 
    from Client c 
    join MemberVisits mv on c.ClientId = mv.RestaurantId 
    join Member m on m.Mem_ID = mv.MemberId 
    join (select RestaurantId, sum(amountSpent) as TotalBusinessSales 
      from MemberVisits 
      group by RestaurantId) s 
     on s.RestaurantId = c.ClientId 
    group by t.ClientName, m.Mem_Name) i 

没有第一级别的子查询,您将有

select c.ClientName, 
     m.Mem_Name, 
     sum(mv.AmountSpent) as totalAmountSpent, 
     sum (mv.AmountSpent)/sum(s.TotalBusinessSales) * 100 as percentAmountSpent 
from Client c 
join MemberVisits mv on c.ClientId = mv.RestaurantId 
join Member m on m.Mem_ID = mv.MemberId 
join ( select RestaurantId, sum(amountSpent) as TotalBusinessSales 
     from MemberVisits 
     group by RestaurantId) s 
      on s.RestaurantId = c.ClientId 
group by t.ClientName, m.Mem_Name 
+0

感谢您的回复。我正在研究你的第二个建议,尽管我得到的错误百分比数额花费... – Noonmoon 2014-10-02 15:46:20

+0

感谢你,我得到了这个工作! – Noonmoon 2014-10-02 17:09:49

+0

@Noonmoon不客气。 – 2014-10-02 17:13:27

1

你可以做这样的事情:

http://sqlfiddle.com/#!6/cf953/4

create table test (ClientName varchar(50), MemberName varchar(50), TotalAmountSpent float) 
insert into test (ClientName, MemberName, TotalAmountSpent) 
select 'Palace', 'John', 376.26 
union all select 'Palace', 'Adem', 646.83 
union all select 'Pizzeria', 'Zoey', 10 

select t.ClientName, 
    t.MemberName, 
    t.TotalAmountSpent, 
    (t.TotalAmountSpent/groupedClientName.totalAmountSpent * 100) as percentAmountSpent 
from test t 
inner join (
    -- this subquery is used to get the total amount per "Client", which then can be used in the outer query to get a per member contribution percent 
    select ClientName, sum(totalAmountSpent) as totalAmountSpent 
    from test 
    group by ClientName 
) groupedClientName on t.ClientName = groupedClientName.ClientName