2012-02-22 39 views
-1

這裏的東西,我有表像這樣LEFT JOIN 3次相同的表上的3倍條件的倍數導致

第一個

ID1 ID2 ID3 

ID1 ID2 ID3 month, value 

我需要的是爲這3個ID的每個組合獲得三個月的值,並且我這樣去了:

SELECT a.ID1, a.ID2, a.ID3, b.value, c.value, d.value 
FROM Table1 a 

LEFT JOIN Table2 b 
ON a.ID1 = b.ID1 
AND a.ID2 = b.ID2 
AND a.ID3 = b.ID3 
WHERE month=2 


LEFT JOIN Table2 c 
ON a.ID1 = c.ID1 
AND a.ID2 = c.ID2 
AND a.ID3 = c.ID3 
WHERE month=3 


LEFT JOIN Table2 d 
ON a.ID1 = d.ID1 
AND a.ID2 = d.ID2 
AND a.ID3 = d.ID3 
WHERE month=4 

而且我得到的值相乘。

任何想法爲什麼這種情況下,或任何其他方法的建議?

謝謝。

+0

在我看來,你根本不需要'table1'來滿足這個查詢,因爲輸出中的所有信息也都在'table2'中。 – 2012-02-22 21:10:03

+0

表1包含應計算結果的所有必需行,即使表2中沒有值。 – 2012-02-22 21:16:39

+0

好的,我看到了,我已更新我的答案 – 2012-02-22 21:19:54

回答

1

假設你想要今後3個月(下個月和接下來的兩個月)根據今天的日期,你可以做到這一點(你也可以設置@base到任何特定的日期以獲得接下來的三個月):

DECLARE @base DATETIME = GETDATE(); 

;WITH x AS 
(
    SELECT a.ID1, a.ID2, a.ID3, 
     m = DATEADD(MONTH, b.[Month]-1, RTRIM(b.[Year])+'0101'), b.value 
    FROM dbo.Table1 AS a INNER JOIN dbo.Table2 AS b 
    ON a.ID1 = b.ID1 AND a.ID2 = b.ID2 AND a.ID3 = b.ID3 
), y AS 
(
    SELECT ID1, ID2, ID3, m, md = DATEDIFF(MONTH, @base, m), value 
    FROM x 
    WHERE DATEDIFF(MONTH, @base, m) BETWEEN 1 AND 3 
) 
SELECT ID1, ID2, ID3, 
    BValue = SUM(CASE WHEN md = 1 THEN value END), 
    CValue = SUM(CASE WHEN md = 2 THEN value END), 
    DValue = SUM(CASE WHEN md = 3 THEN value END) 
FROM y 
GROUP BY ID1, ID2, ID3; 
+0

我也有一年,但我沒有提到它,以不復雜的問題。而且我必須先走三個月。我有變量@m和@y,我這樣做:首先在「月= @ m + 1」,第二:m + 2等等。我還寫情況下,當經過一個月12:第三個 示例: d.month = ( CASE WHEN @m> = 10 THEN @m - 9 ELSE @m + 3 END ) AND d.year = ( CASE WHEN @m> = 10 THEN @y + 1 ELSE @y END ) – 2012-02-22 21:26:29

+0

你應該包括在問題的所有相關信息。不要因爲你認爲他們太複雜而放棄事情。 – 2012-02-22 21:29:02

+0

對不起,但是,謝謝你的想法,我會盡力實現這一點。 – 2012-02-22 21:30:08

0

如果是outer join,您可以在那裏放置WHERE month=x右邊的inner join,它不會工作。

+0

我認爲這不是問題,我試着把它放在三個臨時表中,我在那裏插入「哪裏」的行,並試圖加入「月= x」,同樣的問題在這兩種情況。 – 2012-02-22 21:05:29