set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <擷取各車隊申請用車情況,按車隊分組(指定時間片內)>
-- =============================================
ALTER PROCEDURE [dbo].[procReportCarNeedsAnalysisDept]
@fromdate DateTime,
@todate DateTime
AS
BEGIN
--set nocount on;
declare @dID varchar(50),@pID varchar(50),@num int
set @num = 0
--儲存資料的暫存資料表
CREATE TABLE #me(TdID varchar(50),TpID varchar(50),Tname varchar(50),Tnum int,TdepLevel varchar(50))
--各部門用車統計 注意null不可操作,要轉為0(使用函數isnull(value,0))
insert into #me(TdID,TpID,Tname,Tnum,TdepLevel)
SELECT d.departmentID,d.parentDepartID,d.departmentName, isnull(tmp2.num,0),d.departmentLevel
FROM
(SELECT deptID, COUNT(deptID) AS num
FROM
(SELECT a.dispatchID, b.reqID, c.deptID
FROM carDispatch AS a INNER JOIN
dr_Paral AS b ON a.dispatchID = b.dispatchID --and dispatchDate between @fromdate and @todate
INNER JOIN
carReq AS c ON b.reqID = c.reqID
)
AS tmp1
GROUP BY deptID) AS tmp2
RIGHT OUTER JOIN uapDept AS d ON tmp2.deptID = d.departmentID
ORDER BY
d.departmentLevel desc
declare curTest cursor for ( select TdID,TpID,Tnum from #me )
--按上層業務從低向上累加( 7-> 6->5 .... ->2)注意上一個表是按部門層級排序
open curTest
FETCH NEXT FROM curTest INTO @dID,@pID,@num
while @@FETCH_STATUS = 0
Begin
update #me set Tnum = Tnum + @num
where TdID = @pID
FETCH NEXT FROM curTest INTO @dID ,@pID,@num
End
close CurTest
DEALLOCATE CurTest
--顯示4級部門名與用車數量
Select Tname,Tnum from #me where TdepLevel = 4 and TpID = 6209
--drop table #me
END
公司裡實習寫的一個預存程序,複習太多數SQL語句:) 說起來也不複雜,只是不知道能否最佳化一下哈!!
用到了虛表,遊標.
1.虛表裡有一個用法 insert into 後可直接跟select集
2.isnull(name,defaultvalue),如果這個欄位為null的話就付上預設值,因為null不用相加,所以一定要處理一下
3.用到遊標肯定是有迴圈咯
4.right joint .. on ..匹配所有項,即使無資料也付上null值
5.程式是統計各部門用車數量,而每個部門又有子部門父部門,第個部門的用車數是本部門用車量加上所有子部門的用車量,所以要根據本部門的用車量;加到父部門裡,從低級向進階加