2012-01-10 2 views
1

SQL Server 2008 R2を使用していますが、フィールドサービスのインベントリ管理に役立つデータセットを作成しようとしています。ビジネスの観点からは、2年間でゼロコールを持つすべてのバンのすべての部品を余剰として扱いたいと考えています。すべての新しいパーツ、つまりバンに入れたばかりのパーツは、1年間余剰を免除されています。私の考えは、1歳未満のすべての部品と2年後にゼロ以上の呼び出しを持つすべての部品を抽出し、各セットの部品からそのセットを減算して余剰部品を得ることです。SQL Server 2008 R2の行数をカウントする

ただし、このスクリプトを実行すると、スクリプトのcount(*)部分である呼び出しがすべての呼び出しをカウントし、特定の各呼び出しを呼び出しません。 2つのバンが同じ部品を持っている場合、頻繁に起こりますが、部品は各バンにリストされますが、コールは同じです。ここでのスクリプトは次のとおりです。

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)と品番(pro_id)に接合されているトラックのコールと需要テーブル

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 

あります。例えば

部品番号123456はバン10013を持っている場合でも、バン7051はそうで2を有していてもよく、その後、28は、すべてのバンのためのcount(*)としてリストされている最後の2年間で28のコールを持っている場合。

解決

私はいくつかは、私は疑問に追加情報を追加されたときに、私が最初に逃したことを参加しました。

+0

あなたの質問を編集することをお勧めします。サンプルデータとテーブル構造を追加して、提供されたクエリが意味をなさないようにするか、問題を単純化して、他の人がこれを再現する機会を半分にするようにします。 (SSRSのタグと参照を削除し、真の 'sql'タグを追加してください) –

+0

あなたの答えを以下の真の答えとして追加し、それを受け入れてください。あるいは、あなたのコードに固有のものなので、質問を閉じたり削除したりしてください。 –

+0

私は 'bra_id'、' dpr_id'、 'psk_id'を' psk'から 'tdc'にジョインしませんでした。すべては現在、期待どおりに動作しています。 – Tony

答えて

0

私はdpr_idbra_idを逃し、そしてpsk_idpskからtdcに合流します。すべては現在、期待どおりに動作しています。

関連する問題