在SQL Server 2008 R2中计数行
问题描述:
我正在使用SQL Server 2008 R2,我试图创建一个数据集来帮助我们管理我们的现场服务面包车库存。从商业角度来看,我们希望将所有在两年内零呼叫的所有零部件视为剩余部分。所有新零件,即刚装上面包车的零件,均免除1年的盈余。我的想法是在两年内提取所有不到一年的零件和零部件以上的所有零件,然后从每辆面包车上的一组零件中减去该零件以获得多余零件。在SQL Server 2008 R2中计数行
但是,当我运行此脚本时,脚本的count(*)
部分的调用会计算所有调用,而不是每个特定范围的调用。如果两辆货车具有相同的部件,而这种情况经常发生,则该部件将与每辆货车一起列出,但呼叫是相同的。下面是该脚本:
declare @cutoff date, -- 2 years prior to run date
@year int, -- integer year of @cutoff
@month int, -- integer month of @cutoff
@month_string varchar(2), -- @month converted to varchar
@year_string varchar(4) -- @year converted to varchar
set @cutoff = DATEADD(MONTH, -24, CONVERT(date, getdate()))
set @year = YEAR(@cutoff)
set @month = MONTH(@cutoff)
set @year_string = CONVERT(varchar(4), @year)
-- append a '0' to the beginning of 1 digit months
set @month_string = case when @month < 10
then '0' + CONVERT(varchar(2), @month)
else CONVERT(varchar(2), @month)
end
select psk.bra_id branch, -- branch number
psk.psk_id van_num, -- service van number
psk.pmf_id mfg, -- part manufacturer
psk.pro_id part_num, -- part number
-- first 40 characters of description
convert(varchar(40), pdi.pdi_desc) part_desc,
-- date portion of datetime created
convert(date, psk.psk_d_cre) date_new,
max(ppd.ppd_net) net, -- net price of part
-- this was being used to calc calls but gets the same value as count(*)
--tdc.tdc_yyyymm call_date,
--sum(case when tdc.tdc_dem_ord > 0
-- then 1
-- else 0
--end) calls,
-- this is where I think the problem is
COUNT(*) calls
from psk inner join pdi on psk.pmf_id = pdi.pmf_id
and psk.pro_id = pdi.pro_id
inner join ppd on psk.pmf_id = ppd.pmf_id
and psk.pro_id = ppd.pro_id
inner join tdc on psk.pmf_id = tdc.pmf_id
and psk.pro_id = tdc.pro_id
-- range of applicable van numbers
where psk.psk_id between '1000' and '9999'
-- min greater than zero, meaning nonstock parts are not included
and psk.psk_mini > 0
-- van number length = four
and LEN(psk.psk_id) = 4
-- calls are greater than zero
and tdc.tdc_dem_ord > 0
-- new in service date is greater than 1 year ago or the date of the
-- call is in the last two years
and (psk.psk_d_cre > DATEADD(year, -1, getdate()) or
tdc.tdc_yyyymm > @year_string + @month_string)
group by psk.bra_id,
psk.psk_id,
psk.pmf_id,
psk.pro_id,
pdi.pdi_desc,
psk.psk_d_cre --,
--ppd.ppd_net
-- I only want those records that have a count greater than zero
having COUNT(*) > 0
order by psk.psk_id,
psk.pmf_id,
psk.pro_id
我本来认为由包括列表中的组调用将分别为每车数量进行计数面包车号(psk_id
),但事实并非如此。
psk
是产品库存表,指明零件库存的位置,无论是仓库还是服务车。
pmf_id (PK FK char(4) not null) --manufacturer
pro_id (PK FK char(25) not null) --part number
bra_id (PK FK char(4) not null) --branch id
dpr_id (PK FK char(4) not null) --department id
psk_id (PK char(10) not null) --stock location
psk_stktype (PK decimal(1, 0) not null) --stock or non-stock
pdi
是产品说明表。
pmf_id (PK FK char(4) not null) --manufacturer
pro_id (PK FK char(25) not null) --part number
lng_id (PK FK char(3) not null) --language
ppd
是产品的价格表。
pmf_id (PK FK char(4) not null) --manufacturer
pro_id (PK FK char(25) not null) --part number
tdc
是长途电话和需求表
pmf_id (PK FK char(4) not null) --manufacturer
pro_id (PK FK char(25) not null) --part number
bra_id (PK FK char(4) not null) --branch id
dpr_id (PK FK char(4) not null) --department id
psk_id (PK char(10) not null) --stock location
tdc_yyyymm (PK char(6) not null) --year and month of call
所有这些表都对制造商(pmf_id
)和零件号(pro_id
)加盟。
例如,如果部件号123456
在过去的2年,然后28
被列为count(*)
为每车28
电话,即使面包车1001
可能有3
,面包车7051
可能有2
等。
解决:我发现了一些连接,我开始想念,当我添加额外的信息的问题。
答
我错过了bra_id
,dpr_id
和psk_id
从psk
加入到tdc
。所有的工作如预期一样。
我建议你编辑你的问题。要么添加样本数据和表格结构,以便您提供的查询是有意义的,或者简化您的问题,以便其他人有一半的机会来重现此问题。 (当你在这个时候,删除SSRS标签和引用,并添加一个直接的'sql'标签。) – 2012-01-10 15:29:28
请在下面添加你的答案作为一个真实的答案,并将其标记为接受。或者,请关闭或删除该问题,因为它对您的代码非常具体。 – 2012-01-12 08:28:38
我错过了'bra_id','dpr_id'和'psk_id'从'psk'连接到'tdc'。所有的工作如预期一样。 – Tony 2012-01-19 14:21:52