Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能';无法获得所需的SQL结果_Sql_Sql Server - Fatal编程技术网

我能';无法获得所需的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