连接两个表时计算不同的计数

时间:2010-10-05 06:56:49

标签: sql sql-server tsql sql-server-2008 count

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]

我可以通过statewise找到明显的计数。 现在我需要通过城市明智地找到明显的数量。喜欢在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

我使用查找表与此查询类似,但问题是我在整个州内获得了明显的计数,并且该州的每个城市都重复计算相同的计数。

ex:对于ca:10的计数,那么城市的数量应该像La - 5,sanjose - 4,sfo-1。

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

更新 我已经更新了查询和查找表。

2 个答案:

答案 0 :(得分:1)

我认为您需要以下内容,但无法确定无需进一步信息:

;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]

答案 1 :(得分:1)

你暗示的架构似乎有一个缺陷:

您正在尝试获取城市级聚合,但您正在根据状态将数据表(table1)加入城市表(table2)。这将导致同一州的每个城市拥有相同的聚合值;在你的情况下:所有加州州都有10个。

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