2012-01-10 114 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。所有的工作如預期一樣。