SQL查询问题

SQL查询问题,sql,sql-server,Sql,Sql Server,我有这个查询要显示 共有2个表,我将从表翻新中获取翻新编号,而客户id和名称来自表1“客户” SELECT c.[Customer-ID], c.name, COUNT(*)"Number of Renovation" FROM CUSTOMER c, RENOVATION r WHERE c.[Customer-ID] = r.[Customer-ID] GROUP BY c.[Customer-ID], c.name HAVING Count(*) in (SELECT COUNT(*)

我有这个查询要显示

共有2个表,我将从表翻新中获取翻新编号,而客户id和名称来自表1“客户”

SELECT c.[Customer-ID], c.name, COUNT(*)"Number of Renovation"
FROM CUSTOMER c, RENOVATION r
WHERE c.[Customer-ID] = r.[Customer-ID]
GROUP BY c.[Customer-ID], c.name
HAVING Count(*) in 
(SELECT COUNT(*) FROM RENOVATION GROUP BY [Customer-ID])
ORDER BY c.[customer-id]


这不是我进行查询的正确方式,有人知道如何缩短查询吗?还是其他的方法?尽管它仍然找到了答案。顺便说一句,我正在学习SQL server。

好的,那么您想要的是客户和他们所拥有的翻新-为什么不使用:

SELECT c.[Customer-ID], c.name, COUNT(*) AS 'Number of Renovations'
FROM dbo.CUSTOMER c
INNER JOIN dbo.RENOVATION r ON c.[Customer-ID] = r.[Customer-ID]
GROUP BY c.[Customer-ID], c.name
我不太明白您在查询的
部分中使用COUNT(*)来实现什么目的

如果您想让所有客户至少进行一次翻新,请尝试以下方法:

SELECT c.[Customer-ID], c.name, COUNT(*) AS 'Number of Renovations'
FROM dbo.CUSTOMER c
INNER JOIN dbo.RENOVATION r ON c.[Customer-ID] = r.[Customer-ID]
GROUP BY c.[Customer-ID], c.name
HAVING COUNT(*) > 0

HAVING
子句似乎不属于这里<代码>具有
用于根据聚合结果筛选出结果组。例如,可以使用HAVING子句排除没有任何更新的记录:

SELECT c.[Customer-ID], c.name, COUNT(*) AS [Number of Renovations]
FROM dbo.CUSTOMER c
INNER JOIN dbo.RENOVATION r ON c.[Customer-ID] = r.[Customer-ID]
GROUP BY c.[Customer-ID], c.name
HAVING COUNT(*) > 0

我不建议新手使用
关键字,它是

以下内容更为详细,但可能更易于理解,因此更易于维护(我在表
CUSTOMER\u Reformation\u TALLIES
中使用了a,但可能是:

如果您想为未进行翻修的客户包含一个零计数,则
UINON
将此集合设置为上述结果集,例如

WITH CUSTOMER_RENOVATION_TALLIES ("Customer-ID", Tally)
     AS
     (
      SELECT [Customer-ID], COUNT(*) AS Tally
        FROM RENOVATION
       GROUP 
          BY [Customer-ID]
     )
SELECT c."Customer-ID", c.name, r.Tally
  FROM CUSTOMER AS c
       INNER JOIN CUSTOMER_RENOVATION_TALLIES AS r
          ON c."Customer-ID" = r."Customer-ID"
UNION 
SELECT c."Customer-ID", c.name, 0 AS Tally
  FROM CUSTOMER AS c
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM CUSTOMER_RENOVATION_TALLIES AS r
                    WHERE c."Customer-ID" = r."Customer-ID"
                  );
尝试以下查询

select table1.id,table1.name,renovation .mobile_no from table1,renovation where table1.id=renovation.id

我想列出客户和他们的翻新次数。我想使用子查询,但不确定我做的是否正确。Having子句与Where子句类似,只是它附加到Group By子句。由于需求中没有限制条件,因此不需要Having子句。因为@marc_发布了上面的答案相同-代码几乎相同-他应该得到投票。我明白了,这就是is可以有多短,它是有效的!!!!谢谢Marc_s。在我进行下一步之前,我会认为HAVING子句用于查找是否有值。我不同意你的说法“它基本上是用于遗留用途”更重要的是,你链接到的那篇文章说,“
HAVING
的意思与
WHERE
完全相同,但在它后面的条件和它前面的
SELECT
子句中有不同的规则。”
WHERE
have
之间有一个非常重要的区别,这使得
have
不仅仅用于“遗留用途”:
WHERE
在应用分组之前过滤记录,而
have
在应用分组之后对聚合应用过滤。它们做不同的事情这一事实需要不同的术语;如果两个标准操作符都被称为
WHERE
,会有多混乱?@Boris Nikolaevich:it co你会错过要点吗,即引用“如果System R团队意识到他们的语言在FROM子句中不支持派生表的情况下在关系上是不完整的,那么他们(以及在他们之后,Larry Ellison和他的Oracle将SQL带给毫无戒心的公众)可能已经包括了这样的支持,因此允许他们的用户……不必学习。”当然,可能是您完全理解,但持有不同的观点,这对我来说很好:)@Boris Nikolaevich:BTW没有人,AFAIK,建议在同一范围内,
WHERE
子句应该是“对聚合进行过滤”。关键是,之所以出现
HAVING
,是因为SQL不允许嵌套查询,并且由于兼容性问题,
HAVING
随后无法(也永远无法)删除。
select table1.id,table1.name,renovation .mobile_no from table1,renovation where table1.id=renovation.id