2010-10-05 52 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] 

我可以通过状态查找不同的计数。 现在我需要通过明智的城市找到不同的计数。像CA - 3个城市.. sfo,la,sanjose。我有一个查找表,我可以找到状态和城市。计算加入两个表格时的不同计数

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 

此查询找到城市和州名称。

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 

我做类似这样的查询中使用的查找表,但问题是,我得到整个国家的重复计数和计数相同的,则重复在该州各城市。例如:对于ca:10的计数,城市的计数应该像La - 5,sanjose - 4,sfo-1。

但用我的查询得到sfo - 10,la-10,sanjose-10 ..我无法找到较低级别的计数。任何帮助,将不胜感激。

更新: 我已更新查询和查询表。

+0

拉斯维加斯,CA?嗯... – 2010-10-05 09:47:41

+0

我的坏...我会改变它:) – jero 2010-10-05 16:54:06

+0

ID1在第一个表中代表什么?这是城市ID吗? – 2010-10-05 18:45:37

回答

1

我认为你需要像下面这样,但W/O的进一步信息不能确定:

;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

我更新了查找表并且查询 – jero 2010-10-05 18:13:28

+0

试过了这个。我得到了在每个城市重复的状态智能计数。 – jero 2010-10-05 22:43:49

1

你的隐含模式似乎有一个缺陷:

你试图获得城市级别聚合,但是您将根据状态将您的数据表(表1)加入到城市表(表2)中。这将导致处于相同状态的每个城市具有相同的聚合值;在你的情况下:加利福尼亚州的所有州的计数为10.

你能为你的两个表提供实际的DDL语句吗?也许你还有其他专栏(city_id?),它们可能会为你提供必要的数据来纠正你的查询。

+0

我更新了查找表和查询 – jero 2010-10-05 18:10:55

+0

@jero:问题依然存在。最简单的解决方法是将city_id添加到table1或将state_id替换为city_id(根据新的模式)。 – etliens 2010-10-05 22:22:46