写的比较好的存储过程备份

USE 
GO
/****** Object:  StoredProcedure [dbo].[Web_UnitManage_NSMC_tb_Unit_StatByUserID]    Script Date: 2012/10/26 16:20:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

/*------------------------------------
-- 用途:根据用户ID查询辖区场所统计
-- 项目名称:PSM5.7.3
-- 说明:
-- 时间:2012-09-24
-- 编写者: 
--------------------------------------
-- 修改记录:
-- 编号	修改时间		修改人		修改原因		修改标注
------------------------------------*/
/****************************************************************
测试语句
EXEC [Web_UnitManage_NSMC_tb_Unit_StatByUserID] @UserID=0
****************************************************************/
ALTER PROCEDURE [dbo].[Web_UnitManage_NSMC_tb_Unit_StatByUserID]
(
	@UserID INT
)
AS 
	BEGIN
		SET NOCOUNT ON  
		DECLARE @SQL NVARCHAR(MAX) 
		--根据用户ID,将需要处理的地市存入临时表
		SELECT A.AreaCode,
				A.AreaID,
				A.AreaName
				INTO #TempArea
				FROM dbo.NSMC_tb_Area A WITH(NOLOCK)
				WHERE (@UserID=0 OR EXISTS (SELECT 1 
													FROM dbo.NSMC_re_UserArea WITH(NOLOCK) 
													WHERE AreaID=A.AreaID 
													AND UserID=@UserID))
				AND A.ParentCode NOT IN (-1,-2)
		--如果不存在需要处理的记录,直接退出
		IF NOT EXISTS (SELECT 1 FROM #TempArea)
			RETURN
		--建立临时表记录结果集
		CREATE TABLE #TempResult
		(
			AreaID INT,
			AreaCode NVARCHAR(6),
			PoliceStationID INT,
			AreaPoliceName NVARCHAR(30),
			HotelCount INT,
			SchoolCount INT,
			EnterpriseCount INT,
			WifiUnitCount INT,
			AllUnitCount INT,
			OnlineUnit INT,
			OfflineUnit INT,
			UnitOnlineRate NUMERIC(6,2),
			OnlineCustomTotal INT,
			AlertCount INT
		)          
		--先统计地区统计值
		SELECT U.AreaCode,
				COUNT(1) AS OnlineCustomTotal
				INTO #TempAreaComp
				FROM dbo.NSMC_log_Customer C WITH(NOLOCK)
				INNER JOIN dbo.NSMC_tb_Unit U WITH(NOLOCK)
					ON C.UnitID = U.UnitID
				WHERE U.GuildID<>1
				AND C.StartTime>= CONVERT(nvarchar(10),getdate(),120) 
				AND C.StartTime <= CONVERT(nvarchar(10),DATEADD(DAY,1,getdate()),120)
				GROUP BY U.AreaCode

		SELECT U.AreaCode,
				COUNT(1) AS AlertCount
				INTO #TempAreaAlert
				FROM dbo.NSMC_tb_Alert A WITH(NOLOCK)
				INNER JOIN dbo.NSMC_tb_Unit U WITH(NOLOCK)
					ON A.GuildID = U.GuildID AND A.UnitCode = U.UnitCode
				WHERE A.GuildID<>1 
				AND A.AlertDate >= CONVERT(nvarchar(10),getdate(),120) 
				AND A.AlertDate <= CONVERT(nvarchar(10),DATEADD(DAY,1,getdate()),120)
				GROUP BY U.AreaCode

		INSERT INTO #TempResult
		SELECT  MAX(TA.AreaID) AS AreaID,
				TA.AreaCode AS AreaCode,
				NULL AS PoliceStationID,
				MAX(TA.AreaName) AS AreaPoliceName,
				SUM(CASE U.GuildID WHEN 2 THEN 1 ELSE 0 END) AS HotelCount,
				SUM(CASE U.GuildID WHEN 3 THEN 1 ELSE 0 END) AS SchoolCount,
				SUM(CASE U.GuildID WHEN 4 THEN 1 ELSE 0 END) AS EnterpriseCount,
				SUM(CASE U.GuildID WHEN 5 THEN 1 ELSE 0 END) AS WifiUnitCount,
				SUM(CASE WHEN U.GuildID<>1 THEN 1 ELSE 0 END) AS AllUnitCount,
				SUM(CASE WHEN US.CurStatus=1 AND U.GuildID<>1 THEN 1 ELSE 0 END) AS OnlineUnit,
				SUM(CASE WHEN ISNULL(US.CurStatus,0)=0 AND U.GuildID<>1 THEN 1 ELSE 0 END) AS OfflineUnit,
				(CASE WHEN SUM(CASE WHEN U.GuildID<>1 THEN 1 ELSE 0 END)=0 THEN 0 ELSE
				SUM(CASE WHEN US.CurStatus=1 AND U.GuildID<>1 THEN 1 ELSE 0 END)*1.00/SUM(CASE WHEN U.GuildID<>1 THEN 1 ELSE 0 END) END)*100 AS UnitOnlineRate,
				MAX(ISNULL(TAC.OnlineCustomTotal,0)) AS OnlineCustomTotal,
				MAX(ISNULL(TAA.AlertCount,0)) AS AlertCount
				FROM #TempArea TA
				LEFT JOIN dbo.NSMC_tb_Unit U WITH(NOLOCK)
					ON U.AreaCode=TA.AreaCode
				LEFT JOIN dbo.NSMC_re_UnitStatus US WITH(NOLOCK)
					ON U.UnitID = US.UnitID
				LEFT JOIN #TempAreaComp TAC
					ON TA.AreaCode=TAC.AreaCode
				LEFT JOIN #TempAreaAlert TAA
					ON TAA.AreaCode = TA.AreaCode
				GROUP BY TA.AreaCode
		--再统计各警局辖区的统计值
		SELECT UPS.PoliceStationID,
			   COUNT(1) AS OnlineCustomTotal
			   INTO #TempComp
				FROM dbo.NSMC_log_Customer C WITH(NOLOCK)
				INNER JOIN dbo.NSMC_re_UnitPoliceStation UPS WITH(NOLOCK)
					ON C.UnitID = UPS.UnitID
				INNER JOIN dbo.NSMC_tb_Unit U WITH(NOLOCK)
					ON UPS.UnitID = U.UnitID
				WHERE U.GuildID<>1
				AND C.StartTime>= CONVERT(nvarchar(10),getdate(),120) 
				AND C.StartTime <= CONVERT(nvarchar(10),DATEADD(DAY,1,getdate()),120)
				GROUP BY UPS.PoliceStationID


		SELECT UPS.PoliceStationID,
			   COUNT(1) AS AlertCount
			   INTO #TempAlert
				FROM dbo.NSMC_tb_Alert A WITH(NOLOCK)
				INNER JOIN dbo.NSMC_tb_Unit U WITH(NOLOCK)
					ON A.GuildID = U.GuildID AND A.UnitCode = U.UnitCode
				INNER JOIN dbo.NSMC_re_UnitPoliceStation UPS WITH(NOLOCK)
					ON U.UnitID=UPS.UnitID
				WHERE A.GuildID<>1 
				AND A.AlertDate >= CONVERT(nvarchar(10),getdate(),120) 
				AND A.AlertDate <= CONVERT(nvarchar(10),DATEADD(DAY,1,getdate()),120)
				GROUP BY UPS.PoliceStationID

				INSERT INTO #TempResult
				SELECT  MAX(TA.AreaID) AS AreaID,
						TA.AreaCode AS AreaCode,
						PS.PoliceStationID,
						MAX(PS.PoliceStationName) AS AreaPoliceName,
						SUM(CASE U.GuildID WHEN 2 THEN 1 ELSE 0 END) AS HotelCount,
						SUM(CASE U.GuildID WHEN 3 THEN 1 ELSE 0 END) AS SchoolCount,
						SUM(CASE U.GuildID WHEN 4 THEN 1 ELSE 0 END) AS EnterpriseCount,
						SUM(CASE U.GuildID WHEN 5 THEN 1 ELSE 0 END) AS WifiUnitCount,
						SUM(CASE WHEN U.GuildID<>1 THEN 1 ELSE 0 END) AS AllUnitCount,
						SUM(CASE WHEN US.CurStatus=1 AND U.GuildID<>1 THEN 1 ELSE 0 END) AS OnlineUnit,
						SUM(CASE WHEN ISNULL(US.CurStatus,0)=0 AND U.GuildID<>1 THEN 1 ELSE 0 END) AS OfflineUnit,
						(CASE WHEN SUM(CASE WHEN U.GuildID<>1 THEN 1 ELSE 0 END)=0 THEN 0 ELSE
						SUM(CASE WHEN US.CurStatus=1 AND U.GuildID<>1 THEN 1 ELSE 0 END)*1.00/SUM(CASE WHEN U.GuildID<>1 THEN 1 ELSE 0 END) END)*100 AS UnitOnlineRate,
						MAX(ISNULL(TC.OnlineCustomTotal,0)) AS OnlineCustomTotal,
						MAX(ISNULL(TA2.AlertCount,0)) AS AlertCount
						FROM #TempArea TA
						INNER JOIN dbo.NSMC_tb_PoliceStation PS WITH(NOLOCK)
							ON TA.AreaID = PS.AreaID
						LEFT JOIN dbo.NSMC_re_UnitPoliceStation UPS WITH(NOLOCK)
							ON PS.PoliceStationID = UPS.PoliceStationID
						LEFT JOIN dbo.NSMC_tb_Unit U WITH(NOLOCK)
							ON UPS.UnitID = U.UnitID
						LEFT JOIN dbo.NSMC_re_UnitStatus US WITH(NOLOCK)
							ON U.UnitID = US.UnitID
						LEFT JOIN #TempAlert TA2
							ON PS.PoliceStationID=TA2.PoliceStationID
						LEFT JOIN #TempComp TC 
							ON PS.PoliceStationID = TC.PoliceStationID
						GROUP BY TA.AreaCode,PS.PoliceStationID

		SELECT  AreaID,
				AreaCode,
				PoliceStationID,
				AreaPoliceName ,
				HotelCount ,
				SchoolCount,
				EnterpriseCount,
				WifiUnitCount,
				AllUnitCount ,
				OnlineUnit ,
				OfflineUnit,
				UnitOnlineRate,
				OnlineCustomTotal ,
				AlertCount
				 FROM #TempResult ORDER BY AreaCode,PoliceStationID ASC
	END


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值