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 ..我找不到更低级别的计数。任何帮助将不胜感激。
更新 我已经更新了查询和查找表。
答案 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?)可能会提供必要的数据来纠正你的查询。