将表匹配到正确分组

时间:2012-08-31 17:01:42

标签: sql tsql sql-server-2005

我在计算每个县的供应商数量方面遇到了很多麻烦,我们数据库中的每个州。希望有人可以帮助我。

我有一个名为供应商的表,其中列出了供应商ID(密钥)及其当前分配。

下一个表名为邮政编码,我需要的列是邮政编码,FIPS(这是美国各县的代码)和州。这只是一个可能的状态,邮政编码和fips列表

我的第三个表是vendoraddresses,它列出了每个供应商的地址,但没有县或fips列,否则这将非常容易。这通过vendorid密钥链接到供应商表

决赛桌是各县,其中每个fips代码的县名都排成行(即:12345 =县名)

我无法与所有这些表一起工作,以准确计算每个州每个州的供应商数量。我觉得这真的不应该那么难,但我想到了一个精神障碍。以下是我到目前为止,但它不是我需要的。我想知道一个工会或类似的东西是否是将所有这些桌子放在一起的更好选择。

SELECT

va.state
,pc.fips
,count(v.vendorid) as vendors


FROM 
Vendors v
join vendoraddresses va on va.vendorid = v.vendorid
join postalcodes pc on pc.postalcode = va.postalcode
group by va.state, fips
order by va.state, fips

所以在一些帮助下我试图取得一些进展:

SELECT 
State1
,County
,COUNT(Vendor) as Vendors
FROM
(
SELECT
c.name as County, pc.State as State1, v.VendorID as Vendor
FROM 
Vendors v
join vendorserviceareas vsa on vsa.vendorid = v.vendorid
join vendorserviceareaentries vsae on vsae.vendorserviceareaid =     vsa.vendorserviceareaid 
join counties c on c.fips = vsae.fips
join postalcodes pc on pc.fips = c.fips

union 

select c.name as county, s.name as state1, vsa.Vendorid as Vendor from states s
join counties c on c.fips = s.fips
join vendorserviceareaentries vsae on vsae.fips = c.fips
join vendorserviceareas vsa on vsae.vendorserviceareaid = vsa.vendorserviceareaid 


)a
GROUP BY State1, County
Order BY State1, County

我添加的附加表有以下列(使用查询中的缩写)vsa列1 = serviceareaid(数字ID),第2列= vendorid(数字id)第3列=描述(描述服务区域的文本)( varchar(50))

另一个表vsae有以下列,第1列= serviceareaid - 与上表相同,fips =县代码(FK char(5))和邮政编码(char(5))

并且对于更多信息,每个服务都可以被称为“加利福尼亚”或类似的东西,系统然后有每个州,然后县,然后在每个县列出的服务区域的邮政编码,这是我的大多数问题是说谎,因为我可以获得每个县的任何数量的邮政编码,所以我得到了我试图做的虚假计数。

我的最终目标是找出每个县有多少供应商,而不考虑一个县的邮政编码。

1 个答案:

答案 0 :(得分:2)

我相信你遇到的问题是邮政编码可能在多个县。您可以通过运行查询来检查:

select pc.fips, pc.postalcode, count(*)
from postalcodes pc
group by pc.fips, pc.postalcode
having count(*) > 1
order by 3 desc

这将为您提供重复列表。甚至有跨国家的邮政编码。

您需要为县分配邮政编码。如果您有其他信息,例如邮政编码和县的交叉点,您可以尝试以下内容:

from (select pc.*
      from (select pc.*, row_number() over (partition by postal_code order by pop desc) as seqnum
            from postalcodes pc
           ) pc
      where seqnum = 1
     ) pc

这将邮政编码分配给人口较多的县。