2017-03-16 92 views
1

我有以下查詢來優化。SQL Server 2008 R2:結合兩個查詢進行優化

以下用於從利潤表中獲取詳細信息。

  • 第一個內部SELECT:在第一個SELECT語句中,我必須從利潤表中獲取詳細信息併爲每行分配行號。

  • 第二個內部SELECT:在第二個SELECT語句中,我必須做一些計算(總和)。

  • 外部選擇:通過在id上組合它們並對數據進行一些操作來獲得結果。

代碼:

SELECT 
    a.p_id, p_Name, 
    convert(varchar, a.EndDate, 107) EndDate, 
    convert(varchar, a.EndDate, 106) NewEndDate, 
    LTRIM(a.p_id)) + '' + REPLACE(LEFT(CONVERT(VARCHAR, a.EndDate, 106), 6) + '' + RIGHT(CONVERT(VARCHAR, a.EndDate, 106), 2), ' ', '') as Compo, 
    a.GP,   
    b.fpro FirstProfit, 
    (b.fpro - b.spro) prodiff, 
    a.Qtity * a.GP as Ov, 
    a.Qtity, 
    b.fproChanPer 
FROM 
    (SELECT 
     p_Name, p_id, 
     EndDate, 
     GP, FirstProfit, 
     prodiff, 
     Qtity, 
     ROW_NUMBER() OVER (PARTITION By p_Name, p_id ORDER BY EndDate) Rown 
    FROM 
     tbl_profit) a, 
    (SELECT 
     p_id, 
     CAST(SUM(FirstProfit) AS DECIMAL(24,2)) fpro, 
     CAST(SUM(SecondProfit) AS DECIMAL(24,2)) spro, 
     CAST(CAST(SUM(prodiff) AS DECIMAL(24,2))/CAST(SUM(SecondProfit) AS DECIMAL(24,2)) * 100 AS DECIMAL(24,2)) fproChanPer 
    FROM 
     tbl_profit 
    GROUP BY 
     p_id) b  
WHERE 
    b.p_id = a.p_id 
    AND Rown = 1 

我的問題:我可以結合這兩個(化名ab)內SELECT查詢語句的優化?

我的嘗試:我嘗試了使用以下查詢得到不同的計算結果。

SELECT p_Name, 
      p_id, 
      EndDate, 
      GP, 
      FirstProfit, 
      prodiff, 
      Qtity 
      ROW_NUMBER()OVER (PARTITION By p_Name,p_id ORDER By EndDate) Rown, 
      CAST(SUM(FirstProfit) AS DECIMAL(24,2)) fpro, 
      CAST(SUM(SecondProfit) AS DECIMAL(24,2)) spro, 
      CAST(CAST(SUM(prodiff) AS DECIMAL(24,2)) /CAST(SUM(SecondProfit) AS DECIMAL(24,2)) * 100 AS DECIMAL(24,2)) fproChanPer 
    FROM tbl_profit 
    GROUP By p_id,p_Name,EndDate,GP,FirstProfit,prodiff,Qtity 
+0

不確定Sql server 2008是否支持'SUM()OVER()',但如果是的話,您可以使用一個內部選擇。 –

回答

4

tbl_profit必須具有多重P_Name單個的p_id,當你被p_id的分組只有你,而因爲單個的p_id多p_name的得到正確的合計值當你被p_id的分組和p_name您的總金額無論單個p_id具有多個p_name,值都會增加一倍。

你在這種情況下編寫查詢得到Rown = 1記錄的方式是完美的,認爲仍然有優化的餘地我做了一些事情請檢查。

SELECT 
    a.p_id, 
    p_Name, 
    CONVERT(varchar, a.EndDate, 107) EndDate, 
    CONVERT(varchar, a.EndDate, 106) NewEndDate, 
    LTRIM(a.p_id) + '' + REPLACE(LEFT(CONVERT(varchar, a.EndDate, 106), 6) + '' + RIGHT(CONVERT(varchar, a.EndDate, 106), 2), ' ', '') AS Compo, 
    a.GP, 
    b.fpro AS FirstProfit, 
    (b.fpro - b.spro) prodiff, 
    a.Qtity * a.GP AS Ov, 
    a.Qtity, 
    b.fproChanPer 
FROM (
    SELECT 
     a.p_Name, 
     a.p_id, 
     a.EndDate, 
     a.GP, 
     a.FirstProfit, 
     a.prodiff, 
     a.Qtity, 
     ROW_NUMBER() OVER (PARTITION BY a.p_Name, a.p_id ORDER BY a.EndDate) Rown 
    FROM tbl_profit AS a WITH (NOLOCK) 
    ) AS a 
INNER JOIN 
    (
    SELECT 
     b.p_id, 
     CAST(SUM(b.FirstProfit) AS decimal(24, 2)) fpro, 
     CAST(SUM(b.SecondProfit) AS decimal(24, 2)) spro, 
     CAST(CAST(SUM(b.prodiff) AS decimal(24, 2))/CAST(SUM(b.SecondProfit) AS decimal(24, 2)) * 100 AS decimal(24, 2)) fproChanPer 
    FROM tbl_profit AS b WITH (NOLOCK) 
    GROUP BY b.p_id 
    ) AS b 
ON b.p_id = a.p_id 
    AND a.Rown = 1