2011-07-15 149 views
6

我可以從列在一個表像這樣執行不同的(或者非重複的名字)下面的SQL Server的選擇:SELECT COUNT(DISTINCT [名])

SELECT COUNT(DISTINCT [Name]) FROM [MyTable] 

但如果我有多個表(所有這些表都包含名爲[Name]的名稱字段),我需要知道兩個或多個表中非重複名稱的計數。

如果我運行是這樣的:

SELECT COUNT(DISTINCT [Name]) FROM [MyTable1], [MyTable2], [MyTable3] 

我得到一個錯誤,「不明確的列名‘名稱’」。

PS。所有三個表格[MyTable1],[MyTable2],[MyTable3]都是之前選擇的產品。

+0

你想從所有三個表算不算?或者只是從其中之一? – EricZ

+1

「非重複名稱」是什麼意思? –

+0

好吧,比方說,MyTable1的[名稱]欄中有值:「John」,「Mary」,「John」,「Aaron」。 MyTable2的[Name]列有值:「Mary」,「Aaron」,「Aaron」,「Mary」。 MyTable3的[Name]列的值爲:「John」,「Mary」,「John」,「John」。我需要得到點數,例如:「約翰」= 5次,「瑪麗」= 4次,「亞倫」= 3次。 – ahmd0

回答

16

澄清後,使用:

SELECT x.name, COUNT(x.[name]) 
    FROM (SELECT [name] 
      FROM [MyTable] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable2] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable3]) x 
GROUP BY x.name 

如果我理解正確,使用:

SELECT x.name, COUNT(DISTINCT x.[name]) 
    FROM (SELECT [name] 
      FROM [MyTable] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable2] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable3]) x 
GROUP BY x.name 

UNION將刪除重複; UNION ALL不會,而且速度更快。

+0

我想你已經覆蓋了所有選項:) +1 –

+0

而且,無論使用哪種解決方案,UNION ALL都是正確的選擇:) – bobs

+0

夥計們,我爲誤導你而道歉。我只是在學習SQL。我也很好奇,這個代碼是否會在區分大小寫的問題中處理名稱,即「約翰」和「約翰」算作2還是1? – ahmd0

5

編輯:看到最近的評論後不得不改變。

這是否給你你想要的?在合併來自所有表格的行之後,這給每個人一個計數。

SELECT [NAME], COUNT(*) as TheCount 
FROM 
    (
    SELECT [Name] FROM [MyTable1] 
    UNION ALL 
    SELECT [Name] FROM [MyTable2] 
    UNION ALL 
    SELECT [Name] FROM [MyTable3] 
    ) AS [TheNames] 
GROUP BY [NAME] 
+0

謝謝。我也必須測試它。 – ahmd0

1

這裏的另一種方式:

SELECT x.name, SUM(x.cnt) 
FROM (SELECT [name], COUNT(*) AS cnt 
     FROM [MyTable] 
     GROUP BY [name] 
    UNION ALL 
     SELECT [name], COUNT(*) AS cnt 
     FROM [MyTable2] 
     GROUP BY [name] 
    UNION ALL 
     SELECT [name], COUNT(*) AS cnt 
     FROM [MyTable3] 
     GROUP BY [name] 
    ) AS x 
GROUP BY x.name