2011-08-18 132 views
-1

這個查詢的工作原理,但似乎非常低效。一定有更好的方法?必須有更好的方法來編寫這個查詢嗎?

我想要做的是從MarketRates表中選擇4個不同的列,根據公司所在的地區。只有4個地區,在公司表中存儲爲整數1-4。因此,例如,如果領土是「1」,那麼我想選擇4個南加州列(列名是SCA *),但如果領土是「2」,那麼我想選擇4個Norhtern加州列(列名是NCA *)等。

我知道這些表應該有不同的構造,但這是我必須處理的。

的MarketRates表包含這些列(SCA =南加州,NCA =北加州,SNV =內華達州南部,NAZ =北亞利桑那:

  • ENDINGDATE - 最新
  • SCA_MRK - 十進制(8,2 )
  • SCA_RATE - 十進制(8,2)
  • SCA_COMP - 十進制(8,2)
  • SCA_NEG - 十進制(8,2)
  • NCA_MRK - 十進制(8,2)
  • NCA_RATE - 十進制(8,2)
  • NCA_COMP - 十進制(8,2)
  • NCA_NEG - 十進制(8,2)
  • SNV_MRK - 十進制(8,2 )
  • SNV_RATE - 十進制(8,2)
  • SNV_COMP - 十進制(8,2)
  • SNV_NEG - 十進制(8,2)
  • NAZ_MRK - 十進制(8,2)
  • NAZ_RATE - 十進制(8,2)
  • NAZ_COMP - 十進制(8,2)
  • NAZ_NEG - 十進制(8,2)

這是我使用的當前查詢:

Select CompanyName 
    , case TerritoryNumber 
    when 1 then (Select top 1 coalesce(SCA_MRK,0) From MarketRates Order by EndingDate desc) 
    when 2 then (Select top 1 coalesce(NCA_MRK,0) From MarketRates Order by EndingDate desc) 
    when 3 then (Select top 1 coalesce(SNV_MRK,0) From MarketRates Order by EndingDate desc) 
    when 4 then (Select top 1 coalesce(NAZ_MRK,0) From MarketRates Order by EndingDate desc) 
    end AS MRK 
    , case TerritoryNumber 
    when 1 then (Select top 1 coalesce(SCA_RATE,0) From MarketRates Order by EndingDate desc) 
    when 2 then (Select top 1 coalesce(NCA_RATE,0) From MarketRates Order by EndingDate desc) 
    when 3 then (Select top 1 coalesce(SNV_RATE,0) From MarketRates Order by EndingDate desc) 
    when 4 then (Select top 1 coalesce(NAZ_RATE,0) From MarketRates Order by EndingDate desc) 
    end AS RATE 
    , case TerritoryNumber 
    when 1 then (Select top 1 coalesce(SCA_COMP,0) From MarketRates Order by EndingDate desc) 
    when 2 then (Select top 1 coalesce(NCA_COMP,0) From MarketRates Order by EndingDate desc) 
    when 3 then (Select top 1 coalesce(SNV_COMP,0) From MarketRates Order by EndingDate desc) 
    when 4 then (Select top 1 coalesce(NAZ_COMP,0) From MarketRates Order by EndingDate desc) 
    end AS COMP 
    , case TerritoryNumber 
    when 1 then (Select top 1 coalesce(SCA_NEG,0) From MarketRates Order by EndingDate desc) 
    when 2 then (Select top 1 coalesce(NCA_NEG,0) From MarketRates Order by EndingDate desc) 
    when 3 then (Select top 1 coalesce(SNV_NEG,0) From MarketRates Order by EndingDate desc) 
    when 4 then (Select top 1 coalesce(NAZ_NEG,0) From MarketRates Order by EndingDate desc) 
    end AS NEG 
from Company 
where CompanyID = 'THISID' 
+0

是的,有... – SQLMason

+0

其他字段爲空嗎? – JNK

+0

另外,我認爲無論誰設計這個應該自願參加數據庫設計再教育營。 – JNK

回答

2

你應該只需要由於您每次參考同一行,因此請從MarketRates中選擇一行。在子查詢中選擇它並加入它,並且可以在整個查詢中引用它。我重寫了MRK的外觀,以及其他列的類似語法/邏輯。

Select CompanyName 
    , case TerritoryNumber 
    when 1 then coalesce(SCA_MRK,0) 
    when 2 then coalesce(NCA_MRK,0) 
    when 3 then coalesce(SNV_MRK,0) 
    when 4 then coalesce(NAZ_MRK,0) 
    end AS MRK 
    , ...etc 
from Company 
cross join (select top 1 * from MarketRates order by EndingDate desc) MarketRates 
where CompanyID = 'THISID' 
+0

謝謝Derek,這是我所尋找的更多,只有一個選擇語句。 – TomL

0
DECLARE 
    @TerritoryID INT, 
    @CompanyName VARCHAR(32); 

SELECT 
    @CompanyName = CompanyName, 
    @TerritoryID = TerritoryNumber 
FROM Company 
WHERE CompanyID = 'THISID'; 

SELECT TOP 1 
    CompanyName = @CompanyName, 
    MRK = CASE @TerritoryID 
     WHEN 1 THEN SCA_MRK 
     WHEN 2 THEN NCA_MRK 
     WHEN 3 THEN SNV_MRK 
     WHEN 4 THEN NAZ_MRK END, 
    RATE = CASE @TerritoryID 
     WHEN 1 THEN SCA_RATE 
     WHEN 2 THEN NCA_RATE 
     WHEN 3 THEN SNV_RATE 
     WHEN 4 THEN NAZ_RATE END, 
    COMP = CASE @TerritoryID 
     WHEN 1 THEN SCA_COMP 
     WHEN 2 THEN NCA_COMP 
     WHEN 3 THEN SNV_COMP 
     WHEN 4 THEN NAZ_COMP END, 
    NEG = CASE @TerritoryID 
     WHEN 1 THEN SCA_NEG 
     WHEN 2 THEN NCA_NEG 
     WHEN 3 THEN SNV_NEG 
     WHEN 4 THEN NAZ_NEG END 
FROM MarketRates 
ORDER BY EndingDate DESC; 
0

你可以用一個塊的情況下保持它的清潔和更快。 (您可以替換變量類型以匹配列數據類型。) 檢查下面創建的動態SQL。凡在本公司表在公司名稱列有「小樣」和在TerritoryNumber柱2

DECLARE @CompanyName varchar(50), @TerritoryNum int, @ColumnType varchar(10), @SQL VARCHAR(1000); 
SELECT @CompanyName = CompanyName ,@TerritoryNum = TerritoryNumber 
    FROM Company WHERE CompanyID = 'THISID' 
SET @ColumnType = CASE @TerritoryNum WHEN 1 THEN 'SCA_' 
            WHEN 2 THEN 'NCA_' 
            WHEN 3 THEN 'SNV_' 
            WHEN 4 THEN 'NAZ_' 
            END 

SET @SQL = ' 
SELECT 
    ''' + @CompanyName + ''' AS CompanyName, 
    COALESCE(' + @ColumnType + 'MRK,0) AS MRK, 
    COALESCE(' + @ColumnType + 'RATE,0) AS RATE, 
    COALESCE(' + @ColumnType + 'COMP,0) AS COMP, 
    COALESCE(' + @ColumnType + 'NEG,0) AS NEG 
FROM MarketRates 
' 
PRINT @SQL 
EXEC(@SQL) 

動態查詢(可以從打印中可以看出)。將如以下那樣簡單。嘗試將其更改爲公司表格中的其他數字,並且相應的MarketRates列應在動態查詢中出現。

SELECT 
    'Comp' AS CompanyName, 
    COALESCE(NCA_MRK,0) AS MRK, 
    COALESCE(NCA_RATE,0) AS RATE, 
    COALESCE(NCA_COMP,0) AS COMP, 
    COALESCE(NCA_NEG,0) AS NEG 
FROM MarketRates 
相關問題