私は、いくつかの異なるテーブルから多くの異なるデータを取得するストアドプロシージャを構築しています。売上テーブルから販売情報を取り出し、その販売データに対してさまざまな集計を実行する方法が必要です。下の例では、私は一時テーブルを使用してこれを達成していますが、誰かがおそらくより良い方法があると示唆しています。私がここでやっていることを達成するためのより効率的な方法がありますか?一時テーブルは最適なソリューションですか?
SELECT * INTO #TempSales FROM [Sales] WHERE ClientId = @ClientId
SELECT
[Customer].[CustomerID],
[Customer].[AccountBalAmountOpen],
[Customer].[AccountAgeAmountDays0],
[Customer].[AccountAgeAmountDays30],
[Customer].[AccountAgeAmountDays60],
[Customer].[AccountAgeAmountDays90],
[Customer].[AccountAgeAmountDaysOver90],
(SELECT SUM(SalesAmount) FROM #TempSales WHERE CustomerId = [Customer].[CustomerID] AND Origin = 385) AS ServiceLifeTimeSales,
(SELECT SUM(SalesAmount) FROM #TempSales WHERE CustomerId = [Customer].[CustomerID] AND Origin = 385 AND MONTH(SaleDate) = MONTH(GETDATE()) AND YEAR(SaleDate) = YEAR(GETDATE())) AS ServiceMonthToDateSales,
(SELECT SUM(SalesAmount) FROM #TempSales WHERE CustomerId = [Customer].[CustomerID] AND Origin = 385 AND YEAR(SaleDate) = YEAR(GETDATE())) AS ServiceYearToDateSales,
(SELECT SUM(SalesAmount) FROM #TempSales WHERE CustomerId = [Customer].[CustomerID] AND Origin = 385 AND YEAR(SaleDate) = (YEAR(GETDATE()) - 1)) AS ServicePreviousYearSales,
(SELECT SUM(SalesAmount) FROM #TempSales WHERE CustomerId = [Customer].[CustomerID] AND Origin = 460) AS PartsLifeTimeSales,
(SELECT SUM(SalesAmount) FROM #TempSales WHERE CustomerId = [Customer].[CustomerID] AND Origin = 460 AND MONTH(SaleDate) = MONTH(GETDATE()) AND YEAR(SaleDate) = YEAR(GETDATE())) AS PartsMonthToDateSales,
(SELECT SUM(SalesAmount) FROM #TempSales WHERE CustomerId = [Customer].[CustomerID] AND Origin = 460 AND YEAR(SaleDate) = YEAR(GETDATE())) AS PartsYearToDateSales,
(SELECT SUM(SalesAmount) FROM #TempSales WHERE CustomerId = [Customer].[CustomerID] AND Origin = 460 AND YEAR(SaleDate) = (YEAR(GETDATE()) - 1)) AS PartsPreviousYearSales,
[Orders].[CustomerId] AS ParentCustomerId,
[Orders].[OrderId],
[Orders].[OrderStatus],
[Orders].[UnitId],
[Orders].[FleetId],
[Orders].[CreatedDate] AS OrderCreatedDate,
[Orders].[OrderType],
[OrderParts].[OrderId] AS ParentOrderId,
[OrderParts].[PartId],
[OrderParts].[PartDescription],
[OrderParts].[QuantityShip],
[OrderParts].[QuantityBackOrder],
[OrderParts].[CreatedDate] AS PartCreatedDate
FROM [Customer]
LEFT JOIN [Orders]
ON [Orders].[CustomerId] = [Customer].[CustomerID]
LEFT JOIN [OrderParts]
ON [OrderParts].[OrderId] = [Orders].[OrderId]
WHERE [Customer].[ClientID] = @ClientId
DROP TABLE #TempSales
ストアドプロシージャのような手続き型コードは**ベンダー固有のもの** ** - mysql、postgresql、sql-server、oracle、またはdb2のいずれを使用するかを指定するタグを追加してください' - または全く別のもの。 –
選択した文字列内のサブクエリはほとんど処理を進める最善の方法ではありません – Twelfth
とにかく1回の処理で必要なすべての処理を実行できるようです。単一のclientidの最初の選択フィルター。 2番目の選択は他のすべてを行います。クライアントIDフィルタを2番目の選択に追加して、1つのクエリでそれを行うのはなぜですか?遅すぎる?パフォーマンスチューニング(インデックスの追加など) –