2010-04-02 64 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