Advertisement
MikeHNJ

Anal Patel alternate quartile stored proc

Jul 13th, 2012
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 10.52 KB | None | 0 0
  1. --From comment by Anal Patel at http://electrovoid.wordpress.com/2011/08/15/quartile-sql-server/
  2. --** Procedure to Find Median,1st Quartile,3rd Quartile,Minimum and Maximum
  3. ALTER procedure dbo.sp_calc_median
  4. (@tablename varchar(50),
  5. @columnname varchar(50),
  6. @result sql_variant OUTPUT)
  7. as
  8. BEGIN
  9. declare @sqlstmt varchar(200);
  10. declare @stmt nvarchar(max);
  11. DECLARE @rCount INT;
  12. DECLARE @mPos1 INT;
  13. DECLARE @mPos2 INT;
  14. DECLARE @Q1 INT;
  15. DECLARE @Q2 INT;
  16. DECLARE @Q3 INT;
  17. DECLARE @Q4 INT;
  18. DECLARE @result1 SQL_VARIANT;
  19. DECLARE @result2 sql_variant;
  20. DECLARE @resultQ1 sql_variant;
  21. DECLARE @resultQ2 sql_variant;
  22. DECLARE @resultQ3 sql_variant;
  23. DECLARE @resultQ4 sql_variant;
  24. DECLARE @Minimum DECIMAL(10,2);
  25. DECLARE @Maximum DECIMAL(10,2);
  26.  
  27. IF object_id('temp_incentive') IS NULL
  28. BEGIN
  29. CREATE TABLE temp_incentive
  30. (
  31. type VARCHAR(10),
  32. COMPUTER DECIMAL(10,2),
  33. LAPTOP DECIMAL(10,2),
  34. MOUSE DECIMAL(10,2)
  35. )
  36.  
  37. INSERT INTO temp_incentive (type) VALUES ('Median')
  38. INSERT INTO temp_incentive (type) VALUES ('FirstQ')
  39. INSERT INTO temp_incentive (type) VALUES ('ThirdQ')
  40. INSERT INTO temp_incentive (type) VALUES ('Minimum')
  41. INSERT INTO temp_incentive (type) VALUES ('Maximum')
  42. END
  43.  
  44. set nocount ON
  45. set @sqlstmt = 'insert #tempmedian select ' + @columnname +
  46. ' from ' + @tablename + ' order by 1 asc '
  47.  
  48. create table #tempmedian (col sql_variant)
  49. exec (@sqlstmt)
  50.  
  51. SELECT @rCount= count(*) FROM #tempmedian
  52. SELECT @Minimum = Min(convert(DECIMAL(10,2),col)) FROM #tempmedian
  53. SELECT @Maximum = max(convert(DECIMAL(10,2),col)) FROM #tempmedian
  54.  
  55. --UPDATE temp_incentive SET @columnname = @Minimum WHERE type = 'Minimum'
  56.  
  57. SET @stmt = 'update temp_incentive SET '+@columnname+' = '+convert(VARCHAR(max),@Minimum)+' where type = ''Minimum''' ;
  58. EXEC sp_executesql @stmt
  59.  
  60. SET @stmt = 'update temp_incentive SET '+@columnname+' = '+convert(VARCHAR(max),@Maximum)+' where type = ''Maximum''' ;
  61. EXEC sp_executesql @stmt
  62.  
  63. --median
  64. --***************************************************************************
  65. IF (@rCount%2 = 0)
  66. BEGIN
  67. SET @mPos1 = (@rCount/2)
  68. SET @mPos2 = @mPos1+1
  69.  
  70. -- if @mpos1 & @mpos2 is even
  71.  
  72. IF(@mPos1%2 =0)
  73. BEGIN
  74.  
  75. SET @Q1 = (@mPos1/2)
  76. SET @Q2 = @Q1+1
  77.  
  78. SET @Q3 = (@mPos2+@rCount)/2
  79. SET @Q4 = @Q3+1
  80.  
  81. -- PRINT '@rCount'
  82. -- PRINT @rCount
  83. -- PRINT '@mPos1'
  84. -- PRINT @mPos1
  85. -- PRINT '@mPos2'
  86. -- PRINT @mPos2
  87. -- PRINT '@Q1'
  88. -- PRINT @Q1
  89. -- PRINT '@Q2'
  90. -- PRINT @Q2
  91. -- PRINT '@Q3'
  92. -- PRINT @Q3
  93. -- PRINT '@Q4'
  94. -- PRINT @Q4
  95.  
  96. declare c_med cursor scroll for select * from #tempmedian
  97. open c_med
  98. fetch absolute @mPos1 from c_med into @result1
  99. fetch absolute @mPos2 from c_med into @result2
  100. fetch absolute @Q1 from c_med into @resultQ1
  101. fetch absolute @Q2 from c_med into @resultQ2
  102. fetch absolute @Q3 from c_med into @resultQ3
  103. fetch absolute @Q4 from c_med into @resultQ4
  104. close c_med
  105. deallocate c_med
  106.  
  107. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),(convert(DECIMAL(10,2),@result1)+convert(DECIMAL(10,2),@result2))/2.0)+' where type = ''Median''' ;
  108. -- PRINT @stmt
  109. EXEC sp_executesql @stmt
  110.  
  111. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),(convert(DECIMAL(10,2),@resultQ1)+convert(DECIMAL(10,2),@resultQ2))/2.0)+' where type = ''FirstQ''' ;
  112. -- PRINT @stmt
  113. EXEC sp_executesql @stmt
  114.  
  115. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),(convert(DECIMAL(10,2),@resultQ3)+convert(DECIMAL(10,2),@resultQ4))/2.0)+' where type = ''ThirdQ''' ;
  116. -- PRINT @stmt
  117. EXEC sp_executesql @stmt
  118.  
  119. -- SELECT ((convert(DECIMAL(10,2),@result1)+convert(DECIMAL(10,2),@result2))/2)
  120. -- SELECT ((convert(DECIMAL(10,2),@resultQ1)+convert(DECIMAL(10,2),@resultQ2))/2)
  121. -- SELECT ((convert(DECIMAL(10,2),@resultQ3)+convert(DECIMAL(10,2),@resultQ4))/2)
  122. END
  123.  
  124. -- if @mpos1 & @mpos2 is odd
  125.  
  126. ELSE
  127. BEGIN
  128.  
  129. SET @Q1 = (@mPos1+1)/2
  130. SET @Q2 = @Q1+(@rCount/2)
  131.  
  132. -- PRINT @mPos1
  133. -- PRINT @mPos2
  134. -- PRINT @Q1
  135. -- PRINT @Q2
  136.  
  137. declare c_med cursor scroll for select * from #tempmedian
  138. open c_med
  139. fetch absolute @mPos1 from c_med into @result1
  140. fetch absolute @mPos2 from c_med into @result2
  141. fetch absolute @Q1 from c_med into @resultQ1
  142. fetch absolute @Q2 from c_med into @resultQ2
  143. close c_med
  144. deallocate c_med
  145.  
  146. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),(convert(DECIMAL(10,2),@result1)+convert(DECIMAL(10,2),@result2))/2.0)+' where type = ''Median''' ;
  147. EXEC sp_executesql @stmt
  148.  
  149. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),convert(DECIMAL(10,2),@resultQ1))+' where type = ''FirstQ''' ;
  150. EXEC sp_executesql @stmt
  151.  
  152. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),convert(DECIMAL(10,2),@resultQ2))+' where type = ''ThirdQ''' ;
  153. EXEC sp_executesql @stmt
  154.  
  155. -- SELECT ((convert(DECIMAL(10,2),@result1)+convert(DECIMAL(10,2),@result2))/2)
  156. -- SELECT ((convert(DECIMAL(10,2),@resultQ1)))
  157. -- SELECT ((convert(DECIMAL(10,2),@resultQ2)))
  158. END
  159.  
  160. END
  161.  
  162. --***************************************************************************************
  163. --***************************************************************************************
  164. -- Median when count is odd
  165.  
  166. ELSE
  167. BEGIN
  168.  
  169. SET @mPos1 = (@rCount+1)/2
  170. SET @mPos2 = @mPos1+1
  171. -- if @mpos1 & @mpos2 is odd
  172.  
  173. IF(@mPos1%2 = 1)
  174. BEGIN
  175.  
  176. SET @Q1 = (@mPos1/2)
  177. SET @Q2 = @Q1+1
  178.  
  179. SET @Q3 = (@mPos2+@rCount)/2
  180. SET @Q4 = @Q3+1
  181.  
  182. -- PRINT '@rCount'
  183. -- PRINT @rCount
  184. -- PRINT '@mPos1'
  185. -- PRINT @mPos1
  186. -- PRINT '@Q1'
  187. -- PRINT @Q1
  188. -- PRINT '@Q2'
  189. -- PRINT @Q2
  190. -- PRINT '@Q3'
  191. -- PRINT @Q3
  192. -- PRINT '@Q4'
  193. -- PRINT @Q4
  194.  
  195. declare c_med cursor scroll for select * from #tempmedian
  196. open c_med
  197. fetch absolute @mPos1 from c_med into @result1
  198. fetch absolute @Q1 from c_med into @resultQ1
  199. fetch absolute @Q2 from c_med into @resultQ2
  200. fetch absolute @Q3 from c_med into @resultQ3
  201. fetch absolute @Q4 from c_med into @resultQ4
  202. close c_med
  203. deallocate c_med
  204.  
  205. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),convert(DECIMAL(10,2),@result1))+' where type = ''Median''' ;
  206. EXEC sp_executesql @stmt
  207.  
  208. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),(convert(DECIMAL(10,2),@resultQ1)+convert(DECIMAL(10,2),@resultQ2))/2.0)+' where type = ''FirstQ''' ;
  209. EXEC sp_executesql @stmt
  210.  
  211. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),(convert(DECIMAL(10,2),@resultQ3)+convert(DECIMAL(10,2),@resultQ4))/2.0)+' where type = ''ThirdQ''' ;
  212. EXEC sp_executesql @stmt
  213.  
  214. -- SELECT ((convert(DECIMAL(10,2),@result1)))
  215. -- SELECT ((convert(DECIMAL(10,2),@resultQ1)+convert(DECIMAL(10,2),@resultQ2))/2)
  216. -- SELECT ((convert(DECIMAL(10,2),@resultQ3)+convert(DECIMAL(10,2),@resultQ4))/2)
  217.  
  218. END
  219.  
  220. -- if @mpos1 & @mpos2 is even
  221.  
  222. ELSE
  223. BEGIN
  224.  
  225. SET @Q1 = (@mPos1+1)/2
  226. SET @Q2 = (@Q1+(@rCount/2))+1
  227.  
  228. -- PRINT @mPos1
  229. -- PRINT @mPos2
  230. -- PRINT @Q1
  231. -- PRINT @Q2
  232.  
  233. declare c_med cursor scroll for select * from #tempmedian
  234. open c_med
  235. fetch absolute @mPos1 from c_med into @result1
  236. fetch absolute @mPos2 from c_med into @result2
  237. fetch absolute @Q1 from c_med into @resultQ1
  238. fetch absolute @Q2 from c_med into @resultQ2
  239. close c_med
  240. deallocate c_med
  241.  
  242. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),(convert(DECIMAL(10,2),@result1)+convert(DECIMAL(10,2),@result2))/2.0)+' where type = ''Median''' ;
  243. EXEC sp_executesql @stmt
  244.  
  245. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),convert(DECIMAL(10,2),@resultQ1))+' where type = ''FirstQ''' ;
  246. EXEC sp_executesql @stmt
  247.  
  248. SET @stmt = 'update temp_incentive SET ' + quotename(@columnname) +' = '+convert(VARCHAR(max),convert(DECIMAL(10,2),@resultQ2))+' where type = ''ThirdQ''' ;
  249. EXEC sp_executesql @stmt
  250.  
  251. -- SELECT ((convert(DECIMAL(10,2),@result1)+convert(DECIMAL(10,2),@result2))/2)
  252. -- SELECT ((convert(DECIMAL(10,2),@resultQ1)))
  253. -- SELECT ((convert(DECIMAL(10,2),@resultQ2)))
  254. END
  255. END
  256.  
  257. --********************************************************
  258.  
  259. END
  260. GO
  261.  
  262. --*********************** Test Data ***********************
  263.  
  264. IF OBJECT_ID ('dbo.TEST_MEDIAN') IS NOT NULL
  265. DROP TABLE dbo.TEST_MEDIAN
  266. GO
  267.  
  268. CREATE TABLE dbo.TEST_MEDIAN
  269. (
  270. NAME VARCHAR (50) NOT NULL,
  271. COMPUTER INT NOT NULL,
  272. LAPTOP INT NOT NULL,
  273. MOUSE INT NOT NULL,
  274. ID INT IDENTITY NOT NULL
  275. )
  276. GO
  277.  
  278. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  279. VALUES ('Document Control', 150, 78, 65)
  280. GO
  281.  
  282. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  283. VALUES ('Engineering', 100, 89, 26)
  284. GO
  285.  
  286. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  287. VALUES ('Executive', 75, 45, 75)
  288. GO
  289.  
  290. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  291. VALUES ('Facilities and Maintenance', 90, 65, 45)
  292. GO
  293.  
  294. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  295. VALUES ('Finance', 45, 32, 43)
  296. GO
  297.  
  298. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  299. VALUES ('Human Resources', 62, 25, 73)
  300. GO
  301.  
  302. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  303. VALUES ('Information Services', 85, 68, 91)
  304. GO
  305.  
  306. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  307. VALUES ('Marketing', 95, 98, 82)
  308. GO
  309.  
  310. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  311. VALUES ('Production', 45, 52, 93)
  312. GO
  313.  
  314. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  315. VALUES ('Production Control', 32, 56, 95)
  316. GO
  317.  
  318. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  319. VALUES ('Purchasing', 85, 45, 46)
  320. GO
  321.  
  322. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  323. VALUES ('Quality Assurance', 63, 75, 49)
  324. GO
  325.  
  326. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  327. VALUES ('Research and Development', 84, 53, 76)
  328. GO
  329.  
  330. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  331. VALUES ('Sales', 75, 32, 61)
  332. GO
  333.  
  334. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  335. VALUES ('Shipping and Receiving', 12, 62, 65)
  336. GO
  337.  
  338. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  339. VALUES ('Tool Design', 96, 85, 67)
  340. GO
  341.  
  342. INSERT INTO dbo.TEST_MEDIAN (NAME, COMPUTER, LAPTOP, MOUSE)
  343. VALUES ('Control', 200, 178, 165)
  344. GO
  345.  
  346. -- ********************* Execute SP ***********************
  347.  
  348. DECLARE @result sql_variant
  349. EXEC dbo.sp_calc_median 'dbo.test_median', 'COMPUTER', @result OUTPUT
  350.  
  351. DECLARE @result1 sql_variant
  352. EXEC dbo.sp_calc_median 'dbo.test_median', 'LAPTOP', @result1 OUTPUT
  353.  
  354. DECLARE @result2 sql_variant
  355. EXEC dbo.sp_calc_median 'dbo.test_median', 'MOUSE', @result2 OUTPUT
  356.  
  357. SELECT * FROM temp_incentive
  358.  
  359. DROP TABLE temp_incentive
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement