1

我正在尝试从两个查询的联合中进行选择 这两个查询的联合给了我 90,000 条记录,但是当我选择它们的总和时,它给了我 89,800 条记录。因此,总和正在减少记录的数量。

Select Site,building,..., 
SUM(PhysicalCount) as PhysicalResult
From(
    Select Site,building,...,
    Count(TagID) as PhysicalCount 
    FROM Physical
    Where <SomeCondition1>
    Union
    Select Site,building,...,
    Count(TagID) as PhysicalCount 
    FROM Physical
    Where <SomeCondition2>
) T1
Group by Site,building,...,
4

3 回答 3

2

这就是你所期望的。

构造这个简单的例子:

CREATE TABLE #X 
(
[Id] VARCHAR(100),
[Amount] INT
)
INSERT INTO #X VALUES
('michaeljackson',10),
('jim',20),
('jill',20),
('j',30)

CREATE TABLE #Y 
(
[Id] VARCHAR(100),
[Amount] INT
)
INSERT INTO #Y VALUES
('michaeljackson',100),
('jim',200),
('jill',200),
('j',300)

现在尝试运行这个:

SELECT * FROM #X
UNION
SELECT * FROM #Y

现在运行以下命令,这是您的脚本的模型:

SELECT  x.Id,
    SUM(x.Amount) AS "Aggregate"
FROM 
    (
    SELECT * FROM #X
    UNION
    SELECT * FROM #Y
    ) x
GROUP BY x.Id

UNION不会汇总正在UNION编辑的脚本中的数量 - 它只是将一个记录集附加到另一个记录集并删除重复项。如果您想将一个附加到另一个并保留重复项,请使用UNION ALL

于 2013-03-24T10:13:13.577 回答
2

首先,您的查询没有意义,因为您count在子查询中有一个没有对应的group by. 这应该返回一个错误。

如果您想要组的总和,而不是聚合组,请改用窗口函数:

Select Site,building,..., 
       SUM(PhysicalCount) over (partition by site, building) as PhysicalResult
From(
    Select Site,building,...,
    Count(TagID) as PhysicalCount 
    FROM Physical
    Where <SomeCondition1>
    group by site, building
    Union
    Select Site,building,...,
    Count(TagID) as PhysicalCount 
    FROM Physical
    Where <SomeCondition2>
    group by site, building
    ) T1

尽管union删除了重复项,但显然存在具有不同计数的站点和建筑物的组合。

也许您的意图实际上是这样做的:

    Select Site, building, Count(TagID) as PhysicalCount 
    FROM Physical
    Where (<SomeCondition1>) or (<someCondition2)
    group by site, building;
于 2013-03-24T13:25:02.960 回答
2

是的,您应该看到预期的差异。
给你一个例子,你就会明白为什么在 group by 之后,总行数小于你在内部联合查询中得到的行数。例如,这是您的内部查询输出:

站点 1, 建筑物 1, ...., 15
站点 1,建筑 1,......,16

您在内部查询中使用 UNION ,但这 2 行不同,因为 count 不同。
但是,然后您在外部查询中使用 GROUP BY,按站点分组,建筑物,......
然后这 2 行将变为 1,并且计数将为 31

于 2013-03-24T08:25:20.287 回答