2017-03-04 8 views
0

私は、各顧客の売り上げを合計売り上げで割ることによって値が導出される%共有列を作成したいと考えています。私は以下のクエリを使用しているが、列 'セール'が見つかりませんエラーを取得します。売り上げ列の合計600円を得る方法がありますか?助けてください...選択クエリの計算列?

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; 

- あなたは【セール】列を定義し、同じSQL内の関数で使用することはできません

Desired Result: 

Customer Sale %Share 
Zbyszek 100 16.66 % 
Yvonne 200 33.33 % 
Yoshi 300 50.00 % 
+0

該当する場合は、dbmsとバージョンにタグを付けてください。 –

+0

私はMicrosoft SQL Server Management Studioを使用しています2016 –

+0

'having '条件を使用する理由について説明できますか?クエリには表示されますが、期待される結果は表示されません。 –

答えて

0

あなたは、既存のクエリにかなり変更する必要があります。私はあなたがwith rollupが必要とは思わない。

合計売上を得るにはsum() over()を使用してください。次に、各販売額を合計で割ってパーセンテージを取得します。同様に、avg() over()を使用すると、平均を計算し、sales> = 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; 

平均を計算することなく、share> = 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; 
+0

エラー:列「MY_DB.dbo.Order.CustomerId」は、集計関数またはGROUP BY句に含まれていないため、選択リストでは無効です。 –

+0

私はそれを編集しました。編集したバージョンを試してください。 –

+0

それは働いた..ありがとうたくさん.... –

0

。 これを達成する最も簡単な方法は、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; 
関連する問題