加入多连接选择

时间:2017-04-18 17:09:06

标签: sql sql-server join

我有6个表的多连接查询,我需要从同一查询中获取带有去年值的新列。由于论坛上的常见答案,这个想法是正确的,但不知何故,我的结果只在同一年找到了值(如果我在条件下手动替换它),而不是前一个....

我错过了什么?

  • 列名被翻译,所以我希望没有语法错误
  • 目的:MS SSRS 2014报告>比较选定年份和上一年度的值 - 例如1/2017对比1/2016
  • 在原始查询中,我使用条件(年,年-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:拼写删除

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 

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