2011-08-22 124 views
2

我有這樣的查詢,以顯示SQL查詢問題

有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服務器。

+0

我想列出客戶和他們有翻新的數量。我想使用子查詢,但不知道如果我做正確的事情。 – Desmond

+0

Having子句與Where子句類似,只是它附加到Group By子句。由於要求中沒有限制條件,因此不需要Having條款。 – deutschZuid

回答

5

OK,所以你想讓客戶,他們有裝修 - 爲什麼不使用:

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 
+0

我看,那是多麼短暫,可以,它的作品!謝謝Marc_s。 我會認爲在我做下一步之前,HAVING子句用於查找是否有值。 – Desmond

3

HAVING條款似乎不是T o屬於這裏。 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 
+1

由於@marc_s在上面發佈了相同的答案 - 並且代碼幾乎相同 - 他應該得到選票。 –

+0

感謝boris的評論,將從中吸取教訓。 – Desmond

0

我不建議新手在HAVING關鍵字,它是essentially for legacy purposes

以下是更詳細的,但可能會更容易理解,因此保持(我用的桌子CUSTOMER_RENOVATION_TALLIES一個CTE,但它可能是一個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" 
       ); 
+0

我不同意你的陳述,「它本質上是爲了遺留的目的」,甚至更多與你鏈接到的文章說,「HAVING'的意思與WHERE完全相同,但是關於什麼可以編寫的規則有不同的規則它跟隨它的條件以及物理先於它的'SELECT'子句。「WHERE和HAVING之間有一個非常重要的區別,它使得HAVING不僅僅適用於」遺留目的「:WHERE在應用分組之前過濾記錄,'HAVING'對聚合應用過濾_after_ –

+0

事實上,他們做不同的事情需要不同的術語;如果兩個標準操作符被稱爲「WHERE」,多少**更多**令人困惑? –

+0

@Boris Nikolaevich:它可能是你錯過了主要即引用「如果只有System R團隊意識到他們的語言在FROM子句中沒有支持派生表的語言是關係不完整的,那麼他們(在他們之後,Larry Ellison和他的Oracle將SQL帶給了毫無戒心的公衆)可能包括這樣的支持,從而允許他們的用戶...不必學習HAVING。「當然,這可能是你完全理解但持有不同的觀點,這對我來說很好:) – onedaywhen

0

嘗試下面的查詢,

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