【发布时间】:2020-08-10 19:20:01
【问题描述】:
在 SQL Server 中,我有两个事实表。 FactA 我将使用 COUNT(DISTINCT) 并且需要使用两个连接来从 DimB 获取所需的 GROUP BY 和 WHERE 数据。 FactB 使用 SUM 并且只需要一个连接到 DimB。现在我可以让这些查询一个一个地工作,但我完全迷失了,试图将它们合并到一个查询中。
这是一个极其简化的示例数据:
CREATE TABLE FactA
([Customer] varchar(3), [Dept] varchar(5))
;
INSERT INTO FactA
([Customer], [Dept])
VALUES
('Aaa', 'DeptA'),
('Bbb', 'DeptA'),
('Ccc', 'DeptA'),
('Ddd', 'DeptB'),
('Fff', 'DeptB'),
('Aaa', 'DeptC'),
('Aaa', 'DeptC')
;
CREATE TABLE DimA
([Dept] varchar(5), [Area] varchar(2))
;
INSERT INTO DimA
([Dept], [Area])
VALUES
('DeptA', 'SW'),
('DeptB', 'NW'),
('DeptC', 'SE')
;
CREATE TABLE DimB
([Area] varchar(2), [Code] varchar(2), [PO] varchar(2))
;
INSERT INTO DimB
([Area], [Code], [PO])
VALUES
('SW', 'XA', 'Z1'),
('NW', 'XB', 'Z3'),
('SE', 'XC', 'Z5')
;
CREATE TABLE FactB
([Sales] int, [Code] VARCHAR(2))
;
INSERT INTO FactB
([Sales], [Code])
VALUES
(20, 'XA'),
(10, 'XA'),
(25, 'XA'),
(30, 'XB'),
(40, 'XB'),
(15, 'XC'),
(20, 'XC'),
(35, 'XC')
;
自行工作并给出预期结果的示例查询是:
SELECT DimB.PO,COUNT(DISTINCT FactA.Customer) As Customers
FROM FactA
JOIN DimA ON DimA.Dept = FactA.Dept
Join DimB ON DimB.Area = DimA.Area
GROUP BY DimB.PO
SELECT DimB.PO, sum(FactB.Sales) As TotalSales
FROM FactB
JOIN DimB ON DimB.Code = FactB.Code
GROUP BY DimB.PO
我需要将这两者结合起来,这样我就可以通过一个查询得到结果,并使用 DimB 中的 GROUP BY 和 WHERE 子句。我试过这个:
SELECT DimB.PO,COUNT(DISTINCT FactA.Customer) As Customers, SUM(FactB.Sales) As TotalSales
FROM FactA
JOIN DimA ON DimA.Dept = FactA.Dept
Join DimB ON DimB.Area = DimA.Area
Join FactB ON FactB.Code = DimB.Code
GROUP BY DimB.PO
它惨遭失败,因为它在 TotalSales 中让位于太多的数字。我相信这是太多的销售额,因为有很多加入。搜索我相信子查询可能是答案,但我对我应该对哪一部分进行子查询感到不知所措。非常感谢任何有时间提供帮助的人。
【问题讨论】:
-
您期望从“组合”查询中得到什么结果?这对我们来说并不明显,因为您的单独查询按
DimB.PO分组,但您的组合查询却试图按DimB.Code分组。 -
抱歉,我编辑了“组合”查询以使用 DimB.PO,因为能够使用 DimB-table 进行分组或 where 子句非常重要。
-
抛开错字,向我们展示您期望的结果对您仍然有用。
标签: sql sql-server