我能';无法获得所需的SQL结果
我有两张桌子: 所有者我能';无法获得所需的SQL结果,sql,sql-server,Sql,Sql Server,我有两张桌子: 所有者 +----+------+------------+ | id | name | birth_year | +----+------+------------+ | 1 | John | 1970 | | 2 | Jane | 1980 | | 3 | Jack | 1990 | | 4 | Josh | 2000 | +----+------+------------+ 博伊洛格 +----+----------
+----+------+------------+
| id | name | birth_year |
+----+------+------------+
| 1 | John | 1970 |
| 2 | Jane | 1980 |
| 3 | Jack | 1990 |
| 4 | Josh | 2000 |
+----+------+------------+
博伊洛格
+----+----------+------------+
| id | owner_id | date |
+----+----------+------------+
| 1 | 1 | 01/01/2016 |
| 2 | 2 | 01/02/2016 |
| 3 | 2 | 01/03/2016 |
| 4 | 1 | 01/04/2016 |
+----+----------+------------+
我需要从Owners表中获取所有信息,再加上每位所有者的购买数量:
+-----------+-------------+-------------------+--------------+
| owners.id | owners.name | owners.birth_year | buylog.Count |
+-----------+-------------+-------------------+--------------+
| 1 | John | 1970 | 2 |
| 2 | Jane | 1980 | 2 |
| 3 | Jack | 1990 | 0 |
| 4 | Josh | 2000 | 0 |
+-----------+-------------+-------------------+--------------+
我尝试了以下查询,但返回时出错:
Select
o.id,
o.name,
o.birth_year,
Count(b.id) as Count
From
owners o
Left Outer Join
buylog b
On
b.owner_id = o.id
错误消息应该非常清楚,您缺少一个
group by
子句:
Select
o.id,
o.name,
o.birth_year,
Count(b.id) as Count
From
owners o
Left Outer Join
buylog b
On
b.owner_id = o.id
Group By o.id,
o.name,
o.birth_year
错误消息应该非常清楚,您缺少一个
group by
子句:
Select
o.id,
o.name,
o.birth_year,
Count(b.id) as Count
From
owners o
Left Outer Join
buylog b
On
b.owner_id = o.id
Group By o.id,
o.name,
o.birth_year
由HoneyBadger进行的查询将很好,但这可能会更好:
SELECT o.id
, o.name
, o.birth_year
, COALESCE(b.Count, 0) AS Count
FROM owners o
LEFT JOIN (
SELECT owner_id, COUNT(*) AS Count
FROM buylog
GROUP BY owner_id
) AS b
ON b.owner_id = o.id;
它应该会产生完全相同的结果。由Honeybacker进行查询会很好,但是这可能会更好:
SELECT o.id
, o.name
, o.birth_year
, COALESCE(b.Count, 0) AS Count
FROM owners o
LEFT JOIN (
SELECT owner_id, COUNT(*) AS Count
FROM buylog
GROUP BY owner_id
) AS b
ON b.owner_id = o.id;
SELECT o.*,
CASE
WHEN temp.Buylog_count IS NULL THEN 0
ELSE temp.Buylog_count
END
FROM Owners o
LEFT JOIN
(
SELECT b.owner_id AS oid, COUNT(*) AS Buylog_count
FROM Buylog b
GROUP BY b.owner_id
)temp ON temp.oid = o.id
它应该会产生完全相同的结果。因此我应该在GROUP BY子句中包括除计数之外的所有字段?是的,当您使用聚合函数时,不在聚合函数中选择的所有属性都应该在GROUP BY中。常规GROUP BY规则说:如果指定了GROUP BY子句,SELECT列表中的每个列引用必须标识分组列或是集合函数的参数。如果此答案为您提供了解决方案(我怀疑是这样),您可以将其作为答案接受。因此,我应该在GROUP BY子句中包括除count之外的所有字段?是,使用聚合函数时,所有未在聚合函数中选择的属性都应在group BY中。常规group BY规则说明:如果指定了group BY子句,选择列表中的每个列引用必须标识分组列或是集合函数的参数。如果此答案为您提供了解决方案(我怀疑它提供了),您可以将其作为答案来接受。在解释数据和查询方面做得很好。在不发布错误方面做得不好在解释数据和查询方面做得好。不发布错误的糟糕工作如果
buylog
表中没有该owner\u id
的项目,buylog\u count
将为NULL
,而不是0
。它不符合A/C.这一点,其余部分或多或少是@EvaldasBuinauskas答案的副本。就副本而言,你的答案与我的答案有多相似令人怀疑:因为我是stackoveflow的新用户,对它的使用不太友好。在发布我的答案之前,我没有收到最近的行动。需要在发布前刷新页面。非常抱歉犯了这些错误。如果buylog
表中没有该owner\u id
的项目,buylog\u count
将为NULL
,而不是0
。它不符合A/C.这一点,其余部分或多或少是@EvaldasBuinauskas答案的副本。就副本而言,你的答案与我的答案有多相似令人怀疑:因为我是stackoveflow的新用户,对它的使用不太友好。在发布我的答案之前,我没有收到最近的行动。需要在发布前刷新页面。非常抱歉犯了这些错误。我以后会处理的。
SELECT o.*,
CASE
WHEN temp.Buylog_count IS NULL THEN 0
ELSE temp.Buylog_count
END
FROM Owners o
LEFT JOIN
(
SELECT b.owner_id AS oid, COUNT(*) AS Buylog_count
FROM Buylog b
GROUP BY b.owner_id
)temp ON temp.oid = o.id