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
はバン1001
が3
を持っている場合でも、バン7051
はそうで2
を有していてもよく、その後、28
は、すべてのバンのためのcount(*)
としてリストされている最後の2年間で28
のコールを持っている場合。
:私はいくつかは、私は疑問に追加情報を追加されたときに、私が最初に逃したことを参加しました。
あなたの質問を編集することをお勧めします。サンプルデータとテーブル構造を追加して、提供されたクエリが意味をなさないようにするか、問題を単純化して、他の人がこれを再現する機会を半分にするようにします。 (SSRSのタグと参照を削除し、真の 'sql'タグを追加してください) –
あなたの答えを以下の真の答えとして追加し、それを受け入れてください。あるいは、あなたのコードに固有のものなので、質問を閉じたり削除したりしてください。 –
私は 'bra_id'、' dpr_id'、 'psk_id'を' psk'から 'tdc'にジョインしませんでした。すべては現在、期待どおりに動作しています。 – Tony