2012-01-10 148 views
1

我正在使用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等。


解决:我发现了一些连接,我开始想念,当我添加额外的信息的问题。

+0

我建议你编辑你的问题。要么添加样本数据和表格结构,以便您提供的查询是有意义的,或者简化您的问题,以便其他人有一半的机会来重现此问题。 (当你在这个时候,删除SSRS标签和引用,并添加一个直接的'sql'标签。) – 2012-01-10 15:29:28

+0

请在下面添加你的答案作为一个真实的答案,并将其标记为接受。或者,请关闭或删除该问题,因为它对您的代码非常具体。 – 2012-01-12 08:28:38

+0

我错过了'bra_id','dpr_id'和'psk_id'从'psk'连接到'tdc'。所有的工作如预期一样。 – Tony 2012-01-19 14:21:52

回答

0

我错过了bra_id,dpr_idpsk_idpsk加入到tdc。所有的工作如预期一样。