SQL查询问题

时间:2011-08-22 19:16:31

标签: sql sql-server

我有这个查询显示

有2个表格,我将从表格翻新中获得翻新的数量,而客户ID和名称来自表格1,客户。

enter image description here

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服务器。

4 个答案:

答案 0 :(得分:5)

好的,所以你想要客户和装修 - 为什么不使用:

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(*) IN......部分尝试实现的目标......

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

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

答案 1 :(得分:3)

HAVING子句似乎不属于此处。 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

答案 2 :(得分:0)

我不建议新手使用HAVING关键字,它是essentially for legacy purposes

以下内容比较详细,但可以更容易理解,因此可以维护(我已经使用CTE表格CUSTOMER_RENOVATION_TALLIES但它可能是VIEW

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";

如果您希望在没有装修的情况下为客户添加零计数,则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"
                  );

答案 3 :(得分:0)

尝试以下查询,

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