2013-05-30 75 views
1

我需要顯示的月利率在Excel 2007中一組固定的管道使用MS查詢即使管道有它必須以這種方式顯示替代左連接

required output http://i42.tinypic.com/29j615.jpg

沒有月租率

我已經使用SQL Server 2008 R2中的以下代碼完成了它。

SELECT P.Name  AS [Pipeline Name], 
     PR.Id, 
     PR.[Name], 
     PH.[Value] AS Rate 
FROM [GAS].[dbo].[Pipelinerate] PR 
     INNER JOIN Pipeline P 
       ON P.Id = PR.Pipelineid 
     LEFT OUTER JOIN [GAS].[dbo].[Pipelineratehistory] PH 
       ON PH.[Pipelinerateid] = PR.[Id] 
       AND (PH.[Month] = ? --Month 
        AND PH.[Year] = ?) --Year 
WHERE (PR.[Id] IN (197, 198, 1, 2, 3, 5, 67, 68, 23)) 
     AND ISNULL(PH.Deprecated, 'n') <> 'Y' 
ORDER BY [Pipeline name], 
      PR.[Name] 

當我嘗試做在MS查詢在Excel 2007,然後我得到我收到以下錯誤

[Microsoft][ODBC SQL Server Driver] Invalid Parameter Number

[Microsoft][ODBC SQL Server Driver] Invalid Descriptor Index

我發現通過試錯,如果我從ON子句中刪除條件的參數並將其放在WHERE Clause中,如下所示

SELECT P.Name  AS [Pipeline Name], 
     PR.Id, 
     PR.[Name], 
     PH.[Value] AS Rate 
FROM [GAS].[dbo].[Pipelinerate] PR 
     INNER JOIN Pipeline P 
       ON P.Id = PR.Pipelineid 
     LEFT OUTER JOIN [GAS].[dbo].[Pipelineratehistory] PH 
       ON PH.[Pipelinerateid] = PR.[Id] 
WHERE (PR.[Id] IN (197, 198, 1, 2, 3, 5, 67, 68, 23)) 
     AND (PH.[Month] = ? --Month 
      AND PH.[Year] = ?) --Year 
     AND ISNULL(PH.Deprecated, 'n') <> 'Y' 
ORDER BY [Pipeline name], 
      PR.[Name] 

代碼工作在MS查詢和給出的結果

actual output http://i42.tinypic.com/5qiog.jpg

在此輸出中沒有利率月供管道不顯示。因此這段代碼不起作用。因此,我試圖在這種情況下找到LEFT JOIN的替代方案,以便使用MS Query在Excel中獲得所需的輸出。

協會
管道和PipelineRate - 可選一對多的關係
PipelineRate和PipelineRateHistory - 可選一對多的關係

任何人都可以提出其他建議左連接還是有辦法做到這一點?

PS:我無法使用存儲過程。我知道如何使用VBA來做到這一點。我需要做到這一點使用MS查詢

+0

什麼是你的表的關聯? –

+0

管道和PipelineRate之間的關聯是可選的一對多關係和PipelineRate和PipelineRateHistory之間的關聯也是可選的一對多關係 – Ram

回答

0

嘗試:

SELECT P.Name  AS [Pipeline Name], 
     PR.Id, 
     PR.[Name], 
     PH.[Value] AS Rate 
FROM [GAS].[dbo].[Pipelinerate] PR 
     INNER JOIN Pipeline P 
       ON P.Id = PR.Pipelineid 
     LEFT OUTER JOIN [GAS].[dbo].[Pipelineratehistory] PH 
       ON PH.[Pipelinerateid] = PR.[Id] 
       AND PH.[Month] = ? --Month 
        AND PH.[Year] = ? --Year 
WHERE (PR.[Id] IN (197, 198, 1, 2, 3, 5, 67, 68, 23)) 
     AND ISNULL(PH.Deprecated, 'n') <> 'Y' 
ORDER BY [Pipeline name], 
      PR.[Name] 

我所做的只是去掉了一些不必要的括號。顯然Excel有一個錯誤。其中一個解決方法是將其轉換爲存儲過程並從Excel調用存儲過程。從閱讀中可以看出,這些參數是如何確定和編號的。

+1

我試過它沒有工作得到相同的錯誤。我沒有權限創建存儲過程 – Ram

0

也許這只是ODBC嘗試重寫您的查詢失敗。我不知道爲什麼ON版本不起作用,但是您只需要在WHERE中包含空值。空值不等於任何東西,所以=的行正在刪除空行。

SELECT P.Name  AS [Pipeline Name], 
     PR.Id, 
     PR.[Name], 
     PH.[Value] AS Rate 
    FROM [GAS].[dbo].[Pipelinerate] PR 
INNER JOIN Pipeline P 
    ON P.Id = PR.Pipelineid 
    LEFT OUTER JOIN [GAS].[dbo].[Pipelineratehistory] PH 
    ON PH.[Pipelinerateid] = PR.[Id] 
WHERE PR.[Id] IN (197, 198, 1, 2, 3, 5, 67, 68, 23) 
    AND ISNULL(PH.Deprecated, 'n') <> 'Y' 
    AND (PH.[Month] IS NULL OR 
     (PH.[Month] = ? --Month 
    AND PH.[Year] = ?) --Year 
     ) 
ORDER BY [Pipeline name], 
      PR.[Name] 
+0

我試過了,得到的結果與WHERE中的NULL值相同 – Ram

+1

我想我得到相同答案的原因是因爲在聯接中有其他月份相匹配,因此不返回空值 – Ram

0

根據你的第一個查詢你試圖把月過濾器在左連接。 由於這是一個左加入您的記錄月份和年份過濾器不是強制性的。

但在接下來的查詢中,你把過濾器放在哪裏,這樣查詢就不會給你返回任何結果。

如果您的月份和年份過濾器是強制性的,請將其放在哪裏,第二個查詢會給出正確數量的結果。

否則請使用此查詢

SELECT P.Name  AS [Pipeline Name], 
     PR.Id, 
     PR.[Name], 
     PH.[Value] AS Rate 
FROM [GAS].[dbo].[Pipelinerate] PR 
     INNER JOIN Pipeline P 
       ON P.Id = PR.Pipelineid 
     LEFT OUTER JOIN (select [Pipelinerateid],[Value] 
         from [GAS].[dbo].[Pipelineratehistory] 
         where [Month] = ? --Month 
        AND [Year] = ? --Year 
        ) PH 
       ON PH.[Pipelinerateid] = PR.[Id] 
     WHERE (PR.[Id] IN (197, 198, 1, 2, 3, 5, 67, 68, 23)) 
       AND ISNULL(PH.Deprecated, 'n') <> 'Y' 
ORDER BY [Pipeline name], 
      PR.[Name]