如何显示多个表中的所有记录,而不管连接语句是否匹配
How to show all records from multiple tables regardless of match on join statement
我很难找到正确构造此查询的正确语法。我试图显示来自 SalesHistoryDetail 和 SalesVsBudget table 的所有记录。我相信我的查询允许不提取 SalesVsBudget 上的某些记录,而我希望在那个时期内全部记录,无论是否有相应的销售。这是我的代码:
SELECT MAX(a.DispatchCenterOrderKey) AS DispatchCenter,
a.CustomerKey,
CASE WHEN a.CustomerKey IN
(SELECT AddressKey
FROM FinancialData.dbo.DimAddress
WHERE AddressKey >= 99000 AND AddressKey <= 99599) THEN 1 ELSE 0 END AS InterCompanyFlag,
MAX(a.Customer) AS Customer,
a.SalesmanID,
MAX(a.Salesman) AS Salesman,
a.SubCategoryKey,
MAX(a.SubCategoryDesc) AS Subcategory,
SUM(a.Value) AS SalesAmt,
b.FiscalYear AS Year,
b.FiscalWeekOfYear AS Week,
MAX(c.BudgetLbs) AS BudgetLbs,
MAX(c.BudgetDollars) AS BudgetDollars
FROM dbo.SalesHistoryDetail AS a
LEFT OUTER JOIN dbo.M_DateDim AS b ON a.InvoiceDate = b.Date
FULL OUTER JOIN dbo.SalesVsBudget AS c ON a.SalesmanID = c.SalesRepKey
AND a.CustomerKey = c.CustomerKey
AND a.SubCategoryKey = c.SubCategoryKey
AND b.FiscalYear = c.Year AND b.FiscalWeekOfYear = c.WeekNo
GROUP BY a.SalesmanID, a.CustomerKey, a.SubCategoryKey, b.FiscalYear, b.FiscalWeekOfYear
我正在提取两个不同的数据集,显然是 SalesHistoryDetail table 和 SalesVsBudget table。我希望从 SalesVsBudget table 中获取所有 budgetLbs 和 BudgetDollars 值,无论它们是否在连接中匹配。我也想要所有匹配的加入记录,但我还想要 SalesVsBudget 中的每条记录。本质上,我想显示所有销售记录,并且我想在推销员、客户、子类别、年和周匹配时引用 SalesVsBudget 中的预算值,但我还想查看在我的日期范围内没有对应的预算条目那段时间的销售记录。希望这是有道理的。我觉得我非常接近,但我的预算数字并不能反映整个故事,我认为那是因为我的一些记录被排除在外了!请帮忙。
我能够通过使用 FULL OUTER JOIN 来实现这一点。我的问题是 SalesVsBudget 中的记录多于 SalesHistory_V。因此,我必须使 SalesVsBudget 成为初始的 FROM table 和 SaleHistory_V,并使用 FULL OUTER JOIN 并排列所有记录。
我很难找到正确构造此查询的正确语法。我试图显示来自 SalesHistoryDetail 和 SalesVsBudget table 的所有记录。我相信我的查询允许不提取 SalesVsBudget 上的某些记录,而我希望在那个时期内全部记录,无论是否有相应的销售。这是我的代码:
SELECT MAX(a.DispatchCenterOrderKey) AS DispatchCenter,
a.CustomerKey,
CASE WHEN a.CustomerKey IN
(SELECT AddressKey
FROM FinancialData.dbo.DimAddress
WHERE AddressKey >= 99000 AND AddressKey <= 99599) THEN 1 ELSE 0 END AS InterCompanyFlag,
MAX(a.Customer) AS Customer,
a.SalesmanID,
MAX(a.Salesman) AS Salesman,
a.SubCategoryKey,
MAX(a.SubCategoryDesc) AS Subcategory,
SUM(a.Value) AS SalesAmt,
b.FiscalYear AS Year,
b.FiscalWeekOfYear AS Week,
MAX(c.BudgetLbs) AS BudgetLbs,
MAX(c.BudgetDollars) AS BudgetDollars
FROM dbo.SalesHistoryDetail AS a
LEFT OUTER JOIN dbo.M_DateDim AS b ON a.InvoiceDate = b.Date
FULL OUTER JOIN dbo.SalesVsBudget AS c ON a.SalesmanID = c.SalesRepKey
AND a.CustomerKey = c.CustomerKey
AND a.SubCategoryKey = c.SubCategoryKey
AND b.FiscalYear = c.Year AND b.FiscalWeekOfYear = c.WeekNo
GROUP BY a.SalesmanID, a.CustomerKey, a.SubCategoryKey, b.FiscalYear, b.FiscalWeekOfYear
我正在提取两个不同的数据集,显然是 SalesHistoryDetail table 和 SalesVsBudget table。我希望从 SalesVsBudget table 中获取所有 budgetLbs 和 BudgetDollars 值,无论它们是否在连接中匹配。我也想要所有匹配的加入记录,但我还想要 SalesVsBudget 中的每条记录。本质上,我想显示所有销售记录,并且我想在推销员、客户、子类别、年和周匹配时引用 SalesVsBudget 中的预算值,但我还想查看在我的日期范围内没有对应的预算条目那段时间的销售记录。希望这是有道理的。我觉得我非常接近,但我的预算数字并不能反映整个故事,我认为那是因为我的一些记录被排除在外了!请帮忙。
我能够通过使用 FULL OUTER JOIN 来实现这一点。我的问题是 SalesVsBudget 中的记录多于 SalesHistory_V。因此,我必须使 SalesVsBudget 成为初始的 FROM table 和 SaleHistory_V,并使用 FULL OUTER JOIN 并排列所有记录。