2017-04-18 84 views
0

我有多个联接查询通过6个表,我需要从同一个查询获取与上一年值的新列。由于在论坛上的常见答案,这个想法是正确的,但不知何故,我的结果只发现在同一年的价值(如果我在条件下手动取代它),但不是以前的一个....加入多联接选择

我错过了什么?

  • 列名被翻译,所以我希望没有语法错误
  • 目的:MS SSRS 2014报告>的选择和上年度比较值 - 例如二千〇一十七分之一VS二千〇一十六分之一
  • 在我使用(年,年-1)条件下的参数原始查询

查询:

SELECT 
    ,Table6_Date.DateCode 
    ,Table6_Date.MonthX 
    ,Table6_Date.YearX 
    ,Table5.PK_Table5 
    ,Table5.CategoryName as [Table5_CategoryName] 
    ,Table4.PK_Table4 
    ,Table4.Name AS [Table4_Name] 
    ,Table3.Id 
    ,Table3.Ave   --Main Number Values 
    ,Table3.Ots   --Main Number Values 
    ,Table3.Favourability --Main Number Values 
    ,Table2_Country.PK_Table2_Country 
    ,Table2_Country.Name AS [Table2_Country_Name] 
    ,Table1.PK_table1 
    ,Table1.FK_Table2_Country 
    ,Table1.LongDate 
FROM 
    Table1 
    INNER JOIN Table2_Country 
    ON Table1.FK_Table2_Country = Table2_Country.PK_Table2_Country 
    LEFT OUTER JOIN Table3 
    ON Table1.PK_Table1 = Table3.FK_Table1 
    RIGHT OUTER JOIN Table4 
    ON Table3.FK_Table4 = Table4.PK_Table4 
    LEFT OUTER JOIN Table5 
    ON Table5.PK_Table5 = Table4.FK_Table5 
    LEFT OUTER JOIN Table6_Date 
    ON (concat(YEAR([table1].[LongDate]),'M',(Format(Month([table1].[LongDate]),'00')))) = Table6_Date.DateCode 

--there comes the problem part with "Self-Join"-- 
    --LEFT JOIN 
    -- ( 
    -- SELECT * --i use columns namely, but for shorter example "*" 
    -- FROM 
    -- Table1 Table1_LY 
    -- INNER JOIN Table2_Country Table2_Country_LY 
    --  ON Table1_LY.FK_Table2_Country = Table2_Country_LY.PK_Table2_Country 
    -- LEFT OUTER JOIN Table3 Table3_LY 
    --  ON Table1_LY.PK_Table1 = Table3_LY.FK_Table1 
    -- RIGHT OUTER JOIN Table4 Table4_LY 
    --  ON Table3_LY.FK_Table4 = Table4_LY.PK_Table4 
    -- LEFT OUTER JOIN Table5 Table5_LY 
    --  ON Table5_LY.PK_Table5 = Table4_LY.FK_Table5 
    -- LEFT OUTER JOIN Table6_Date Table6_Date_LY 
    --  ON (concat(YEAR([table1_LY].[LongDate]),'M',(Format(Month([table1_LY].[LongDate]),'00')))) = Table6_Date_LY.DateCode 

    -- WHERE 
    --  Table2_Country_LY.PK_Table2_Country = 20 
    --  AND Table6_Date_LY.YearX = 2016 
    --  AND Table6_Date_LY.monthX = 1 
    -- ) LastYearTable 
    -- ON LastYearTable.PK_table1 = Table1.PK_table1 
    -- AND LastYearTable.Id = table3.Id 
    -- AND LastYearTable.PK_table4 = table4.PK_table4 
    -- AND LastYearTable.FK_table5 = table4.FK_table5 
    -- AND LastYearTable.PK_Table2_Country = Table2_Country_LY.PK_Table2_Country 
    --End Of SelfJoin-- 
WHERE 
    Table2_Country.PK_Table2_Country = 20 --(20=France) -- 
    AND Table6_Date.YearX = 2017 
    AND Table6_Date.monthX = 1 

预览输出(没有我的新加入)(2017年和2016年):

DateCode MonthX YearX PK_table5 CategoryName PK_Table4 Table4_Name Id Ave Ots Favourability PK_Table2_Country Table2_CountryName PK_table1 FK_Table2_Country LongDate 
2017M01  1 2017   1 Print 4 Articles 160 100000 4000000 NULL   20 France 147   20 2017-01-01 00:00:00.0000000 
2017M01  1 2017   2 Media 8 Billboards 169 1000000 4900000 50   20 France 147   20 2017-01-01 00:00:00.0000000 
2017M01  1 2017   1 Print 4 Articles 161 200000 4100000 NULL   20 France 148   20 2017-01-01 00:00:00.0000000 
2017M01  1 2017   2 Media 5 Television 162 300000 4200000 NULL   20 France 148   20 2017-01-01 00:00:00.0000000 
2017M01  1 2017   2 Media 6 RadioXYZ 163 400000 4300000 NULL   20 France 148   20 2017-01-01 00:00:00.0000000 
2017M01  1 2017   2 Media 8 Billboards 168 900000 4800000 100   20 France 148   20 2017-01-01 00:00:00.0000000 
----------- --------- ------ ----------- ---------------- ------------ -------------- ---- -------- ---------- ------- ---- -------- ----- ---- -------------- 
2016M01  1 2016   1 Print 4 Articles 164 500000 4400000 NULL   20 France 149   20 2016-01-01 00:00:00.0000000 
2016M01  1 2016   2 Media 8 Billboards 165 600000 4500000 100   20 France 149   20 2016-01-01 00:00:00.0000000 
2016M01  1 2016   1 Print 4 Articles 166 700000 4600000 NULL   20 France 150   20 2016-01-01 00:00:00.0000000 
2016M01  1 2016   2 Media 8 Billboards 167 800000 4700000 100   20 France 150   20 2016-01-01 00:00:00.0000000 

EDIT1:错字删除

+0

尝试'AND Table6_Date> ='2016-01-01'' – samosaris

+0

我想在同一行中获取当前和去年,我之前已经完成了另一个项目,但所有左连接,所以它工作轻松和罚款。我试图复制相同的逻辑,但不成功,所以这就是我选择这种类型的逻辑的原因。 – Popkornak

+0

注释过的代码是否曾经工作,以及您想要现在做什么? – samosaris

回答

0

假设数据,你向我们展示从2017年和2016年打算在此查询到被连接在我看来,这个问题涉及Table3.Id领域。

假设我已经正确地阅读哪些标题与哪些数据一起使用,那么这两个数据集在该字段上不匹配,并且由于您的“自我联接”包含该字段上的联接,因此永远不会返回任何匹配的数据。我不知道你的数据或者什么的所有字段的真正含义,但你可能能够删除此行您的加盟:

AND LastYearTable.Id = table3.Id 

它看起来你有与其他领域的类似问题,至少是PK_Table1。您只需在您期望达成的部分上加入查询的两个版本。

编辑:

通过对事物的样子,我期待加入到上:

MonthX, YearX, PK_Table5, PK_Table4, PK_Table2_Country

使加盟:

) LastYearTable 
ON LastYearTable.MonthX = Table6_Date.MonthX 
AND LastYearTable.YearX = Table6_Date.YearX - 1 
AND LastYearTable.PK_table5 = table5.PK_table5 
AND LastYearTable.PK_table4 = table4.PK_table4 
AND LastYearTable.PK_Table2_Country = Table2_Country_LY.PK_Table2_Country 

由通过这种方式,您还可以从LastYearTable子查询中删除where子句。

+0

正如你写的,你也有一个错字:'PK_Table2_Count'应该是'PK_Table2_Country'。 –

+0

即使我删除这一行,结果仍然是NULL(打印错误删除) – Popkornak

+0

要更新答案:我认为,soi经历了所有列和多数民众赞成为什么我选择最重要的(从每个表识别器) – Popkornak

0

尝试修改您的WHERE声明

WHERE 
    Table2_Country.PK_Table2_Country = 20 --(20=France) -- 
    AND Table6_Date >= '2016-01-01'  

WHERE 
    Table2_Country.PK_Table2_Country = 20 --(20=France) -- 
    AND (Table6_Date.YearX = 2017 OR Table6_Date.YearX = 2016) 
    AND Table6_Date.monthX = 1