2010-04-02 3 views
1

Мне нужна базовая справка TSQL. Вот мой стол макет:SQL Query - нужна базовая помощь

Заказы Таблица

  • ПЛА
  • ZipCode

ZipLookup Таблица

  • ZipCode
  • Государство

Все столбцы являются 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 

Performance не собирается быть очень хорошо, я думаю, для этого потребуется хотя бы одно полное сканирование и, возможно, два, но если вы хотите что-то лучше, вам нужно будет нормализовать схему.

+0

Спасибо за ваш быстрый ответ. Я фактически изменил имя реального столбца на SSN, чтобы оно было короче. :) Можно ли написать запрос, где, если конкретный SSN имеет заказы из нескольких состояний, для этого SSN будет учитываться только состояние с наибольшим количеством заказов? Например, если у конкретного SSN было 5 заказов из Нью-Йорка и 2 ордера из KY, только считайте их из Нью-Йорка. Я обычно делаю простые запросы и перехожу на C# для чего-либо, что я не могу написать, но похоже, что это возможно в SQL. Еще раз спасибо за помощь. –

+0

Абсолютно невероятно. Большое вам спасибо, это очень полезно для меня. –