我有6个表的多连接查询,我需要从同一查询中获取带有去年值的新列。由于论坛上的常见答案,这个想法是正确的,但不知何故,我的结果只在同一年找到了值(如果我在条件下手动替换它),而不是前一个....
我错过了什么?
查询:
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 :(得分: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
子句。