2010-10-05 13 views
3
id1  id2 year State Gender  
==== ====== ====== ===== =======  
1  A  2008 ca  M  
1  B  2008 ca  M  
3  A  2009 ny  F 
3  A  2008 ny  F  
4  A  2009 tx  F 

select 
    state, gender, [year], 
    count (distinct(cast(id1 as varchar(10)) + id2)) 
from 
    tabl1 
group by state, gender, [year] 

Je pourrais trouver le nombre distinct par état. maintenant j'ai besoin de trouver distinct compte par ville sage. comme dans CA - 3 villes .. sfo, la, sanjose. J'ai une table de recherche que j'ai pu trouver l'état et la ville.Calculer nombre distinct lors de la jonction de deux tables

table2 - city  
    ====   
    cityid name 
    ==== ==== 
    1 sfo     
    2 la      
    3 sanjose 

    table 3 - state 
    ==== 
stateid name 
    ==== ==== 
    1 CA 
    2 Az 

table 4 lookup state city 
==== 
pk_cityId pk_state_id 
1    1 
2    1 

select state,city,gender, [year], 
     count (distinct(cast(id1 as varchar(10)) + id2)) 
    from 
     tabl1 p 
    group by state, gender, [year],city 

cette requête pour trouver le nom de la ville et de l'état.

select c.city,s.state from city_state sc 
inner join (select * from state)s on sc.state_id = s.state_id 
inner join (select * from city)c on sc.city_id = c.city_id 

je l'ai fait similaire à cette requête en utilisant la table de consultation, mais le problème est que je reçois le compte distinct dans tous les Etats et même pas de comptage répète pour chaque ville dans l'état. Ex: pour compter pour ca: 10, le nombre de villes devrait être comme La - 5, sanjose - 4, sfo - 1.

mais avec ma requête je reçois comme sfo - 10, la-10, sanjose-10 .. je ne pouvais pas trouver le compte pour le niveau inférieur. Toute aide serait appréciée.

MISE À JOUR: J'ai mis à jour la requête et les tables de recherche.

+0

Las Vegas, CA? Uh-huh ... –

+0

mon mauvais ... k je vais le changer. :) – jero

+0

que signifie ID1 dans la toute première table? Est-ce la City ID? –

Répondre

1

Je pense que vous avez besoin quelque chose comme ce qui suit, mais ne peut pas être sûr w/o plus d'informations:

;WITH DistinctState AS 
(
    SELECT DISTINCT 
      id1 
     , id2 
     , [year] 
     , [State] 
     , Gender 
    FROM tab1 
) 
SELECT s.state 
,  c.city 
,  gender 
,  [year] 
,  count(*) 

FROM  DistinctState s 
    INNER JOIN 
     tab2 c 
    ON s.id1 = c.id1 
AND s.id2 = c.id2 

GROUP BY 
     s.state 
    , c.city 
    , gender 
    , [year] 
+0

J'ai mis à jour la table de recherche et la requête – jero

+0

essayé ceci.still j'obtiens le compte d'état sage répétant sur chaque ville. – jero

1

Votre schéma implicite semble avoir une faille:

Vous essayez de obtenir des agrégats au niveau de la ville, mais vous joignez votre table de données (table1) à votre table de ville (table2) en fonction de l'état. Cela causera CHAQUE ville dans le même état d'avoir les mêmes valeurs agrégées; dans votre cas: tous les états de la Californie ayant un compte de 10.

Pouvez-vous fournir des instructions DDL réelles pour vos deux tables? Peut-être avez-vous d'autres colonnes (city_id?) Qui pourraient vous fournir les données nécessaires pour corriger votre requête.

+0

J'ai mis à jour la table de recherche et la requête – jero

+0

@jero: le problème existe toujours. La solution la plus simple serait d'ajouter city_id à table1 ou de remplacer state_id par city_id (selon votre nouveau schéma). – etliens