选择查询中的计算列?

时间:2017-03-04 21:03:25

标签: sql sql-server rdbms sql-server-2016

我希望通过将每个客户的销售额与总销售额进行划分来创建一个%的共享列。我正在使用下面的查询,但得到错误,列“销售”无法找到。是否有一种方法可以获得销售总额,即600?请帮忙......

permissions

-

Select IsNull([Customer].[FirstName],'Total') as Customer, 
        format(Sum([MY_DB].[dbo].[Order].[TotalAmount]),'0.00')  [Sale],
        FORMAT(sum([MY_DB].[dbo].[Order].[TotalAmount])/ sum([Sale]),'0.00%') as 'Share%'
From Customer
INNER JOIN [MY_DB].[dbo].[Order]
ON [Customer].[Id]=[MY_DB].[dbo].[Order].[CustomerId]
Group By [Customer].[FirstName] with Rollup
Having (Sum([MY_DB].[dbo].[Order].[TotalAmount]) > (Select AVG([MY_DB].[dbo].[Order].[TotalAmount]) From [MY_DB].[dbo].[Order]))
Order By [Customer].[FirstName] Desc;

2 个答案:

答案 0 :(得分:0)

您无法定义[Sale]列并在同一SQL中的函数中使用它。 实现这一目标的最简单方法就是使用外部SQL语句来包围SQL,您还可以计算总和并进行除法。

(我的语法可能不是MS-SQL的确切,但这是为了说明这个想法)

Select [data].[FirstName], 
      format([data].[Sale],'0.00'), 
      format([data].[Sale] / [total].[totalSum],'0.00') FROM

(Select IsNull([Customer].[FirstName],'Total') as Customer, 
       Sum([MY_DB].[dbo].[Order].[TotalAmount]  [Sale],
       From Customer
       INNER JOIN [MY_DB].[dbo].[Order]
       ON [Customer].[Id]=[MY_DB].[dbo].[Order].[CustomerId]
       Group By [Customer].[FirstName] with Rollup
       Having (Sum([MY_DB].[dbo].[Order].[TotalAmount]) > (Select AVG([MY_DB].[dbo].[Order].[TotalAmount]) From [MY_DB].[dbo].[Order])) ) data, 
(Select sum([MY_DB].[dbo].[Order].[TotalAmount] as [totalSum]) from [MY_DB].[dbo].[Order]) total
Order By [data].[FirstName] Desc;

答案 1 :(得分:0)

您必须稍微修改现有查询。我认为你不需要with rollup

获取总销售额sum() over()。然后将每个销售额除以总额以获得百分比。以同样的方式,使用avg() over()您可以计算平均值并查找销售额> gt = = avgamount的客户。

Select Customer,[Sale],[Share%]
from (
Select Distinct 
c.[FirstName] as Customer, 
format(sum(o.[TotalAmount]) over(partition by o.[CustomerId]),'0.00') as [Sale],
format(100.0*sum(o.[TotalAmount]) over(partition by o.[CustomerId]) / sum(o.[TotalAmount]) over(),'0.00%') as 'Share%',
AVG(o.[TotalAmount]) over() as 'AvgAmount'
From Customer c
INNER JOIN [MY_DB].[dbo].[Order] o ON c.[Id]=o.[CustomerId]
) t 
Where Sale >= AvgAmount
Order By Customer Desc;

如果不计算平均值,您只需检查分享> = 50%的客户。

Select Customer,[Sale],[Share%]
from (
Select Distinct 
c.[FirstName] as Customer, 
format(sum(o.[TotalAmount]) over(partition by o.[CustomerId]),'0.00') as [Sale],
format(100.0*sum(o.[TotalAmount]) over(partition by o.[CustomerId]) / sum(o.[TotalAmount]) over(),'0.00%') as 'Share%'
From Customer c
INNER JOIN [MY_DB].[dbo].[Order] o ON c.[Id]=o.[CustomerId]
) t 
Where [Share%] >= 50
Order By Customer Desc;