2012-02-22 38 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