2010-04-02 65 views
1

我需要一些基本的TSQL幫助。這裏是我的表佈局:SQL查詢 - 需要一些基本的幫助

訂單

  • SSN
  • 郵編

ZipLookup

  • 郵編

所有列都是varchars。

我將如何得到每個州有不同SSN數量的州名單?優選地,如果特定SSN具有來自多個狀態的訂單,則只有具有最多訂單的狀態纔會被計入該SSN。

謝謝你給我的任何提示。

回答

4

首先,你最好確保你被允許存儲SSN,因爲有一大堆隱私法律和法規可能會禁止它。

查詢應該是這樣的:

SELECT z.State, COUNT(DISTINCT o.SSN) AS SsnCount 
FROM ZipLookup z 
INNER JOIN Orders o 
    ON o.ZipCode = z.ZipCode 
GROUP BY z.State 

如果你只需要算SSN在其-最頻繁使用狀態:

WITH StateSSNs AS 
(
    SELECT 
     o.SSN, z.State, 
     ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) AS RowNum 
    FROM Orders o 
    INNER JOIN ZipLookup z 
     ON z.ZipCode = o.ZipCode 
    GROUP BY o.SSN, z.State 
) 
SELECT z.State, COUNT(*) AS SsnCount 
FROM ZipLookup z 
INNER JOIN StateSSNs s 
    ON s.State = z.State 
WHERE s.RowNum = 1 
GROUP BY z.State 

性能不會很好,我認爲這將需要至少一次全面掃描,也許需要兩次,但如果你想要更好的東西,那麼你需要規範化模式。

+0

感謝您的快速回復。實際上,我將實際的專欄名稱更改爲SSN,因此它會更短。 :) 是否有可能寫一個查詢,如果一個特定的SSN有來自多個州的訂單,那麼只有該訂單數最多的州纔會被計入該SSN?就像一個特定的SSN有來自NY的5個訂單和來自KY的2個訂單,只計算來自NY的那個。 我通常只做簡單的查詢,然後轉而使用C#來處理任何我無法寫入的內容,但是這似乎可以在SQL中完成。 再次感謝您的幫助。 – 2010-04-03 01:05:28

+0

絕對不可思議。非常感謝,這對我非常有幫助。 – 2010-04-03 02:08:32