我正在使用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
等。
解決:我發現了一些連接,我開始想念,當我添加額外的信息的問題。
我建議你編輯你的問題。要麼添加樣本數據和表格結構,以便您提供的查詢是有意義的,或者簡化您的問題,以便其他人有一半的機會來重現此問題。 (當你在這個時候,刪除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