2017-04-03 16 views
1

私はクエリに問題があります。私は月と年を抽出している注文が非常に多く、毎月の価格のすべてを合計する必要がありますそして年。私が解決策を考え出す唯一の方法は、反復してコストのかかる比較を多数行うことです。これはリレーショナルデータベースの目的を破るようです。小計にしばしば割引が適用されるため、価格は私が持っているクエリで計算されています。私はすべての必要なテーブルを結合し、一致しているが、価格計算のために私は組み込みのSUM()関数を使用することはできません。前もって感謝します!特定の月に発生した注文の合計価格

EDIT:ここにコードがあります。私は今日は明らかにスーパーに散在しています。

`SELECT dbo.SalesOrder.SalesOrderNo 
    ,dbo.SalesOrder.CustomerID 
    ,(dbo.InvoiceDetails.ExtendedPrice * (1 - dbo.Invoice.DiscountPct/100)) AS [Price] 
    ,dbo.Customers.NAME AS [Customer Name] 
    ,dbo.Customers.SalesRepID 
    ,dbo.Employees.FirstName + dbo.Employees.LastName AS [SalesRepName] 
    ,dbo.Estimate.DateCreated AS [Date Quoted] 
    ,dbo.SalesOrder.OrderDate AS [Date Ordered] 
    ,dbo.Invoice.BillingDate AS [Date Invoiced] 
    ,MONTH(dbo.Estimate.DateCreated) AS [Month Quoted] 
    ,MONTH(dbo.SalesOrder.OrderDate) AS [Month Ordered] 
    ,MONTH(dbo.Invoice.BillingDate) AS [Month Invoiced] 
    ,YEAR(dbo.Estimate.DateCreated) AS [Year Quoted] 
    ,YEAR(dbo.SalesOrder.OrderDate) AS [Year Ordered] 
    ,YEAR(dbo.Invoice.BillingDate) AS [Year Invoiced] 
FROM SalesOrder 
INNER JOIN Invoice ON Invoice.SalesOrderID = SalesOrder.SalesOrderID 
INNER JOIN InvoiceDetails ON InvoiceDetails.InvoiceID = Invoice.InvoiceID 
INNER JOIN Customers ON Customers.CustomerID = SalesOrder.CustomerID 
INNER JOIN SalesReps ON Customers.SalesRepID = SalesReps.SalesRepID 
INNER JOIN Employees ON Employees.EmployeeID = SalesReps.EmployeeID 
INNER JOIN Estimate ON Estimate.EstimateID = SalesOrder.EstimateID 
WHERE dbo.Invoice.Approved = '1' 
    AND (YEAR(dbo.Invoice.BillingDate) >= YEAR(GETDATE()) - 1) 
    AND (YEAR(dbo.Estimate.DateCreated) >= YEAR(GETDATE()) - 1) 
    AND (YEAR(dbo.SalesOrder.OrderDate) >= YEAR(GETDATE()) - 1)` 
+0

問題が何であるかは不明ですが、価格をまとめて月単位でグループ化するだけで問題ありません。 –

+0

いくつかのサンプルデータを使用してサンプルスキーマを投稿した場合は便利です。しかし、これは非常に単純な質問のように思われるので、私は何かが起こっていることが分かりませんか? – pmbAustin

+0

サンプル入力データセットと期待される出力を提供できますか? –

答えて

0

その他の情報がなければ、あなたはこのような何かを行うことができない理由がある:それは絶対に私に、私と一緒に滞在してくれてありがとうですか?テーブル名を仮定し

SELECT YEAR(ORDER_DATE) AS [Year], MONTH(ORDER_DATE) AS [Month], SUM(AMOUNT) AS [Total] 
    FROM Orders 
GROUP BY YEAR(ORDER_DATE), MONTH(ORDER_DATE) 
ORDER BY YEAR(ORDER_DATE), MONTH(ORDER_DATE) 

は「受注」であり、それは数値として列のdatetimeとして「ORDER_DATE」、および「量」を持っています。


価格の計算を示す、あなたの更新クエリに基づいて、物事の周りの簡単な方法は、ちょうどあなたの既存のクエリのうち、CTE(共通テーブル式)を作成し、そのBY /グループを選択することです。.. 。このような何か:

WITH sales AS (
    SELECT dbo.SalesOrder.SalesOrderNo 
     ,dbo.SalesOrder.CustomerID 
     ,(dbo.InvoiceDetails.ExtendedPrice * (1 - dbo.Invoice.DiscountPct/100)) AS [Price] 
     ,dbo.Customers.NAME AS [Customer Name] 
     ,dbo.Customers.SalesRepID 
     ,dbo.Employees.FirstName + dbo.Employees.LastName AS [SalesRepName] 
     ,dbo.Estimate.DateCreated AS [Date Quoted] 
     ,dbo.SalesOrder.OrderDate AS [Date Ordered] 
     ,dbo.Invoice.BillingDate AS [Date Invoiced] 
     ,MONTH(dbo.Estimate.DateCreated) AS [Month Quoted] 
     ,MONTH(dbo.SalesOrder.OrderDate) AS [Month Ordered] 
     ,MONTH(dbo.Invoice.BillingDate) AS [Month Invoiced] 
     ,YEAR(dbo.Estimate.DateCreated) AS [Year Quoted] 
     ,YEAR(dbo.SalesOrder.OrderDate) AS [Year Ordered] 
     ,YEAR(dbo.Invoice.BillingDate) AS [Year Invoiced] 
    FROM SalesOrder 
    INNER JOIN Invoice ON Invoice.SalesOrderID = SalesOrder.SalesOrderID 
    INNER JOIN InvoiceDetails ON InvoiceDetails.InvoiceID = Invoice.InvoiceID 
    INNER JOIN Customers ON Customers.CustomerID = SalesOrder.CustomerID 
    INNER JOIN SalesReps ON Customers.SalesRepID = SalesReps.SalesRepID 
    INNER JOIN Employees ON Employees.EmployeeID = SalesReps.EmployeeID 
    INNER JOIN Estimate ON Estimate.EstimateID = SalesOrder.EstimateID 
    WHERE dbo.Invoice.Approved = '1' 
     AND (YEAR(dbo.Invoice.BillingDate) >= YEAR(GETDATE()) - 1) 
     AND (YEAR(dbo.Estimate.DateCreated) >= YEAR(GETDATE()) - 1) 
     AND (YEAR(dbo.SalesOrder.OrderDate) >= YEAR(GETDATE()) - 1) 
) 
SELECT [Month Ordered], [Year Ordered], SUM([Price]) AS TotalOrderedPrice 
    FROM Sales 
GROUP BY [Month Ordered], [Year Ordered] 
ORDER BY [Month Ordered], [Year Ordered] 

これはあなたの元のクエリのverbatumを使用して、グループ分けを行うに下部のSELECTでCTEを使用し、上の注文(計算価格を合計含む)、CTEという名前の「販売」を作成しますそのクエリの結果についてこれはシンプルな「構文的砂糖」です。この種の表現は、計算された値やサブ選択や、何を持っているかを問うためにクエリを再作成しなければならない場合よりもはるかに簡単であり、便利なトリックです。

+0

問題は、クエリに価格が計算されているということです。クエリの価格はデータベースにはなく、変更することは禁じられています。ステートメント内のコストを計算することはできません。残念なことに、SQLの新機能では、ネストされたSELECTステートメントがそれを修正するかどうかや、より良いオプションがあるかどうかはわかりません。 – Kishi

+0

あなたがここで何を言っているのかは分からないので、あなたが持っているSQLやスキーマなどを示す例を挙げておくと、非常に便利です。ここであなたが尋ねた質問に答えました。どうやらあなたは別の質問をするつもりだったので、質問をより正確に編集する必要があります。 – pmbAustin

+0

価格は私が書いている質問で計算されます、私は最終的な価格に計算している小計と割引率を持っています: '(dbo.InvoiceDetails.ExtendedPrice *(1 - dbo.Invoice.DiscountPct/100))AS [価格] 'これは、私が言うことができるものから、価格にSUM()を置くのを妨げているようです。私はあなたの答えに感謝しています。それは質問に対する私の心配を解決し、これらの詳細を残してしまって申し訳ありません。(これはあまりに長い間これを理解しようとしていました。同じSELECT文で価格を参照する方法はありますか? – Kishi

関連する問題