設為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 3973|回復: 1
打印 上一主題 下一主題

求分月數(shù)據(jù)的技巧(T-SQL)

[復制鏈接]

點擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2011-10-18 02:06:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /*
  2. 該生成指定年度的部門每月能耗數(shù)據(jù)收集情況
  3. @DeviceType 為 0 時,表示所有裝備
  4. @DeptID 為 '' 或 為 'all',表示所有部門
  5. */

  6. CREATE FUNCTION [dbo].[f部門能耗數(shù)據(jù)收集情況](@YEAR int, @DeptID varchar(20), @DeviceType int)
  7. RETURNS TABLE
  8. AS
  9. RETURN (
  10.         SELECT TOP 100 PERCENT V.年度, V.月份, V.裝備類型編號, V.裝備類型,
  11.                 V.裝備序號, V.名稱,
  12.                 V.部門標識, V.部門,
  13.                 CASE WHEN R.裝備序號 IS NULL THEN 0 ELSE 1 END AS 數(shù)據(jù), R.已完成
  14.         FROM (
  15.                 SELECT O.裝備序號, O.裝備類型編號, O.部門, O.部門標識, O.名稱, O.裝備類型, @YEAR AS 年度, M.月份
  16.                 FROM (
  17.                         SELECT D.裝備序號, D.裝備類型編號, P.部門, P.部門標識, L.名稱, T.裝備類型
  18.                         FROM dbo.t裝備 AS D INNER JOIN
  19.                                 dbo.v裝備列表 AS L ON D.裝備序號 = L.裝備序號 INNER JOIN
  20.                                 dbo.t部門 AS P ON L.一級部門標識 = P.部門標識 INNER JOIN
  21.                                 dbo.t裝備類型 AS T ON D.裝備類型編號 = T.裝備類型編號
  22.                         WHERE (D.裝備類型編號=@DeviceType OR (@DeviceType=0 AND D.裝備類型編號 IN (1, 2, 3, 4)))
  23.                                 AND (一級部門標識=@DeptID OR @DeptID='' OR UPPER(@DeptID)='ALL')
  24.                                 AND (D.審核 = 1) AND (D.報廢 <> 1) AND (D.閑置 <> 1)) AS O CROSS JOIN
  25.                         (SELECT 1 AS 月份 UNION
  26.                          SELECT 2 AS 月份 UNION
  27.                          SELECT 3 AS 月份 UNION
  28.                          SELECT 4 AS 月份 UNION
  29.                          SELECT 5 AS 月份 UNION
  30.                          SELECT 6 AS 月份 UNION
  31.                          SELECT 7 AS 月份 UNION
  32.                          SELECT 8 AS 月份 UNION
  33.                          SELECT 9 AS 月份 UNION
  34.                          SELECT 10 AS 月份 UNION
  35.                          SELECT 11 AS 月份 UNION
  36.                          SELECT 12 AS 月份) AS M
  37.                 ) AS V LEFT OUTER JOIN (
  38.                 SELECT 裝備序號, 年度, 月份, 已完成 FROM dbo.t能耗辦公樓 WHERE (年度 = @YEAR) UNION
  39.                 SELECT 裝備序號, 年度, 月份, 已完成 FROM dbo.t能耗囤船 WHERE (年度 = @YEAR) UNION
  40.                 SELECT 裝備序號, 年度, 月份, 已完成 FROM dbo.t能耗海巡艇 WHERE (年度 = @YEAR) UNION
  41.                 SELECT 裝備序號, 年度, 月份, 已完成 FROM dbo.t能耗車輛 WHERE (年度 = @YEAR)
  42.                 ) AS R
  43.                 ON V.裝備序號 = R.裝備序號 AND V.年度 = R.年度 AND V.月份 = R.月份
  44.         ORDER BY V.裝備類型編號, V.裝備序號, V.月份
  45. )
復制代碼
  1. -- 用常量生成月份派生表
  2. SELECT 1 AS 月份 UNION
  3. SELECT 2 AS 月份 UNION
  4. SELECT 3 AS 月份 UNION
  5. SELECT 4 AS 月份 UNION
  6. SELECT 5 AS 月份 UNION
  7. SELECT 6 AS 月份 UNION
  8. SELECT 7 AS 月份 UNION
  9. SELECT 8 AS 月份 UNION
  10. SELECT 9 AS 月份 UNION
  11. SELECT 10 AS 月份 UNION
  12. SELECT 11 AS 月份 UNION
  13. SELECT 12 AS 月份
復制代碼
CROSS JOIN 生成每月裝備列表,然后與裝備數(shù)據(jù)左聯(lián)結(jié)。

本帖被以下淘專輯推薦:

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖2 訂閱訂閱

點擊這里給我發(fā)消息

2#
 樓主| 發(fā)表于 2011-10-19 12:56:35 | 只看該作者
通過自定義函數(shù)改進:
  1. CREATE FUNCTION dbo.f裝備月份能耗數(shù)據(jù)完成(@DeviceID int, @YEAR int, @MONTH int)
  2. RETURNS NVARCHAR(3) AS
  3. BEGIN
  4.         DECLARE @RET NVARCHAR(3)
  5.         DECLARE @R bit
  6.         SELECT TOP 1 @R=已完成
  7.         FROM (
  8.                 SELECT 已完成 FROM dbo.t能耗辦公樓 WHERE (裝備序號=@DeviceID AND 年度 = @YEAR AND 月份=@MONTH) UNION
  9.                 SELECT 已完成 FROM dbo.t能耗囤船 WHERE (裝備序號=@DeviceID AND 年度 = @YEAR AND 月份=@MONTH) UNION
  10.                 SELECT 已完成 FROM dbo.t能耗海巡艇 WHERE (裝備序號=@DeviceID AND 年度 = @YEAR AND 月份=@MONTH) UNION
  11.                 SELECT 已完成 FROM dbo.t能耗車輛 WHERE (裝備序號=@DeviceID AND 年度 = @YEAR AND 月份=@MONTH)
  12.                 ) AS E
  13.        
  14.         SET @RET= CASE WHEN @R=1 THEN N'已完成' WHEN @R=0 THEN N'未完成' ELSE N'未填報' END
  15.         RETURN @RET
  16. END
  17. GO

  18. CREATE FUNCTION dbo.f裝備年度各月能耗數(shù)據(jù)完成(@YEAR int, @DeptID varchar(20), @DeviceType int)
  19. RETURNS TABLE AS
  20. RETURN
  21. (
  22.         SELECT D.裝備序號, D.裝備類型編號, P.部門, P.部門標識, L.名稱, T.裝備類型, @YEAR AS 年度,
  23.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 1) AS [1],
  24.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 2) AS [2],
  25.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 3) AS [3],
  26.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 4) AS [4],
  27.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 5) AS [5],
  28.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 6) AS [6],
  29.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 7) AS [7],
  30.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 8) AS [8],
  31.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 9) AS [9],
  32.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 10) AS [10],
  33.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 11) AS [11],
  34.                 dbo.f裝備月份能耗數(shù)據(jù)完成(D.裝備序號, @YEAR, 12) AS [12]
  35.         FROM dbo.t裝備 AS D INNER JOIN
  36.                 dbo.v裝備列表 AS L ON D.裝備序號 = L.裝備序號 INNER JOIN
  37.                 dbo.t部門 AS P ON L.一級部門標識 = P.部門標識 INNER JOIN
  38.                 dbo.t裝備類型 AS T ON D.裝備類型編號 = T.裝備類型編號
  39.         WHERE (D.裝備類型編號=@DeviceType OR (@DeviceType=0 AND D.裝備類型編號 IN (1, 2, 3, 4)))
  40.                 AND (一級部門標識=@DeptID OR @DeptID='' OR UPPER(@DeptID)='ALL')
  41.                 AND (D.審核 = 1) AND (D.報廢 <> 1) AND (D.閑置 <> 1)
  42. )
  43. GO
復制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 10:26 , Processed in 0.151503 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表