Wacky_rubia

индувидуальная задача Саша

Dec 13th, 2015
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 8.93 KB | None | 0 0
  1. USE Sasha
  2.  
  3. CREATE TABLE mountains
  4. (
  5.     id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
  6.     name VARCHAR(30) NOT NULL,
  7.     height INT NOT NULL,
  8.     country VARCHAR(30) NOT NULL,
  9.     region VARCHAR(30) NOT NULL
  10. )
  11. GO
  12.  
  13. CREATE TABLE climbers
  14. (
  15.     id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
  16.     name VARCHAR(30) NOT NULL,
  17.     addr VARCHAR(30) NOT NULL
  18. )
  19. GO
  20.  
  21. CREATE TABLE regs
  22. (
  23.     id INT NOT NULL PRIMARY KEY IDENTITY(1,1),
  24.     startdate DATE NOT NULL,
  25.     enddate DATE NOT NULL,
  26.     mountain_id INT NOT NULL FOREIGN KEY REFERENCES mountains(id),
  27.     climber_id INT NOT NULL FOREIGN KEY REFERENCES climbers(id),
  28.     group_id INT NOT NULL
  29. )
  30. GO
  31.  
  32. INSERT INTO mountains (name, height, country, region)
  33. VALUES
  34. ('Эверест', 8848, 'Америка', 'Нью Йорк'),
  35. ('Шунут', 2454, 'Россия', 'Урал'),
  36. ('Ежовая', 1800, 'Россия', 'Краснодарский край')
  37. GO
  38.  
  39. INSERT INTO climbers (name, addr)
  40. VALUES
  41. ('Антон', 'Шаумяна 19-33'),
  42. ('Джон', 'Уолл стрит 12-44'),
  43. ('Алексей', 'Посадская 14-88'),
  44. ('Глеб', 'Малышева 22-16')
  45. GO
  46.  
  47. INSERT INTO regs (startdate, enddate, mountain_id, climber_id, group_id)
  48. VALUES
  49. ('2011-11-10', '2011-11-11', 1, 2, 1),
  50. ('2011-11-10', '2011-11-11', 1, 3, 1),
  51. ('2012-11-16', '2012-11-19', 2, 4, 2),
  52. ('2012-06-19', '2012-06-19', 2, 1, 3),
  53. ('2012-06-19', '2012-06-19', 2, 4, 3)
  54. GO
  55.  
  56. ------------------------------------------------------------------------------
  57.  
  58. CREATE TRIGGER climber_on_one_mountain
  59. ON regs
  60. FOR INSERT
  61. AS
  62. BEGIN
  63.     DECLARE @COUNT INT = (SELECT COUNT(r.id) FROM inserted AS i, regs AS r WHERE
  64.         i.id != r.id AND i.climber_id = r.climber_id AND
  65.         ((DATEDIFF(DAY, r.startdate, i.startdate) >= 0 AND DATEDIFF(DAY, i.enddate, r.startdate) >= 0) OR
  66.         (DATEDIFF(DAY, i.startdate, r.startdate) >= 0 AND DATEDIFF(DAY, r.enddate, i.startdate) >= 0) OR
  67.         (DATEDIFF(DAY, i.enddate, r.enddate) >= 0 AND DATEDIFF(DAY, r.enddate, i.startdate) >= 0) OR
  68.         (DATEDIFF(DAY, r.enddate, i.enddate) >= 0 AND DATEDIFF(DAY, i.enddate, r.startdate) >= 0)));
  69.     IF (@COUNT > 0)
  70.     BEGIN
  71.         print 'Альпинист уже забирается на другую гору!'
  72.         ROLLBACK TRANSACTION
  73.     END
  74. END
  75. GO
  76.  
  77. INSERT INTO regs (startdate, enddate, mountain_id, climber_id, group_id)
  78. VALUES ('2011-11-10', '2011-11-10', 1, 2, 1)
  79.  
  80. DROP TRIGGER climber_on_one_mountain
  81. GO
  82.  
  83. -----------------------------------------------------------------------------------
  84.  
  85. DROP FUNCTION get_mountains
  86. DROP FUNCTION get_groups
  87. GO
  88.  
  89. CREATE FUNCTION get_mountains(@sdate DATE, @edate DATE)
  90. RETURNS @mountains TABLE
  91. (
  92.     name VARCHAR(30) NOT NULL,
  93.     date_of_last_reg DATE
  94. )
  95. AS
  96. BEGIN
  97.     INSERT @mountains
  98.     SELECT m.name, MIN(r.startdate) FROM regs AS r JOIN mountains AS m ON r.mountain_id = m.id WHERE
  99.         DATEDIFF(DAY, @sdate, r.startdate) >= 0 AND DATEDIFF(DAY, r.enddate, @edate) >= 0
  100.     GROUP BY m.name
  101.     RETURN;
  102. END;
  103. GO
  104.  
  105. CREATE FUNCTION get_groups(@sdate DATE, @edate DATE, @mount_name VARCHAR(30))
  106. RETURNS @groups TABLE
  107. (
  108.     group_number VARCHAR(30) NOT NULL,
  109.     startdate DATE
  110. )
  111. AS
  112. BEGIN
  113.     INSERT @groups
  114.     SELECT DISTINCT r.group_id, r.startdate FROM regs AS r
  115.         WHERE r.mountain_id IN (SELECT id FROM mountains WHERE name=@mount_name) AND
  116.         (DATEDIFF(DAY, @sdate, r.startdate) >= 0 AND DATEDIFF(DAY, r.enddate, @edate) >= 0)
  117.     RETURN;
  118. END;
  119. GO
  120.  
  121.  
  122. DECLARE @sdate DATE = '2000-01-01'
  123. DECLARE @edate DATE = '2015-01-01'
  124.  
  125. ------
  126.  
  127. DECLARE @Mountains_cursor CURSOR
  128. SET @Mountains_cursor = CURSOR
  129. FOR
  130.     SELECT * FROM get_mountains(@sdate, @edate)
  131. OPEN @Mountains_cursor
  132.  
  133. DECLARE @mount_name VARCHAR(30),
  134.         @date_ofLast_reg DATE,
  135.         @group_number VARCHAR(30),
  136.         @startdate DATE
  137.  
  138. FETCH @Mountains_cursor INTO @mount_name, @date_ofLast_reg
  139. WHILE @@FETCH_STATUS = 0
  140. BEGIN
  141.     PRINT '-----------------------'
  142.     print @mount_name + ' ' + CAST(@date_ofLast_reg AS VARCHAR(30))
  143.  
  144.         DECLARE @Groups_cursor CURSOR
  145.         SET @Groups_cursor = CURSOR
  146.         FOR
  147.             SELECT * FROM get_groups(@sdate, @edate, @mount_name) ORDER BY startdate
  148.         OPEN @Groups_cursor
  149.         fetch @Groups_cursor INTO @group_number, @startdate
  150.         IF @@FETCH_STATUS <> 0
  151.         PRINT '         <<None>>'    
  152.         WHILE @@FETCH_STATUS = 0
  153.         BEGIN
  154.             PRINT '         ' + CAST(@group_number AS VARCHAR(10)) + ' ' + CAST(@startdate AS VARCHAR(12))
  155.             fetch @Groups_cursor INTO @group_number, @startdate
  156.         END
  157.         close @Groups_cursor
  158.  
  159.     print ' '
  160.     FETCH @Mountains_cursor INTO @mount_name, @date_ofLast_reg
  161. END
  162. close @Mountains_cursor
  163. GO
  164.  
  165. ------------------------------------------------------------------------
  166.  
  167. DROP FUNCTION get_climbers
  168. DROP FUNCTION get_climber_mountains
  169. GO
  170.  
  171. CREATE FUNCTION get_climbers(@sdate DATE, @edate DATE)
  172. RETURNS @climbers TABLE
  173. (
  174.     name VARCHAR(30) NOT NULL
  175. )
  176. AS
  177. BEGIN
  178.     INSERT @climbers
  179.     SELECT c.name FROM regs AS r JOIN climbers AS c ON c.id = r.climber_id WHERE
  180.         DATEDIFF(DAY, @sdate, r.startdate) >= 0 AND DATEDIFF(DAY, r.enddate, @edate) >= 0
  181.     GROUP BY c.name
  182.     RETURN;
  183. END;
  184. GO
  185.  
  186. CREATE FUNCTION get_climber_mountains(@sdate DATE, @edate DATE, @climber_name VARCHAR(30))
  187. RETURNS @groups_and_mountains TABLE
  188. (
  189.     mountain_name VARCHAR(30) NOT NULL,
  190.     group_number VARCHAR(30) NOT NULL,
  191.     startdate DATE
  192. )
  193. AS
  194. BEGIN
  195.     INSERT @groups_and_mountains
  196.     SELECT DISTINCT m.name, r.group_id, r.startdate FROM regs AS r JOIN mountains AS m ON m.id = r.mountain_id
  197.         WHERE r.climber_id IN (SELECT id FROM climbers WHERE name=@climber_name) AND
  198.         (DATEDIFF(DAY, @sdate, r.startdate) >= 0 AND DATEDIFF(DAY, r.enddate, @edate) >= 0)
  199.     RETURN;
  200. END;
  201. GO
  202.  
  203. ---
  204.  
  205. DECLARE @sdate DATE = '2000-01-01'
  206. DECLARE @edate DATE = '2015-01-01'
  207.  
  208. ------
  209.  
  210. DECLARE @Climbers_cursor CURSOR
  211. SET @Climbers_cursor = CURSOR
  212. FOR
  213.     SELECT * FROM get_climbers(@sdate, @edate)
  214. OPEN @Climbers_cursor
  215.  
  216. DECLARE @climber_name VARCHAR(30),
  217.         @mount_number VARCHAR(30),
  218.         @group_number VARCHAR(30),
  219.         @startdate DATE
  220.  
  221. FETCH @Climbers_cursor INTO @climber_name
  222. WHILE @@FETCH_STATUS = 0
  223. BEGIN
  224.     PRINT '-----------------------'
  225.     print @climber_name
  226.  
  227.         DECLARE @Groups_cursor CURSOR
  228.         SET @Groups_cursor = CURSOR
  229.         FOR
  230.             SELECT * FROM get_climber_mountains(@sdate, @edate, @climber_name) ORDER BY startdate
  231.         OPEN @Groups_cursor
  232.         fetch @Groups_cursor INTO @mount_number, @group_number, @startdate
  233.         IF @@FETCH_STATUS <> 0
  234.         PRINT '         <<None>>'    
  235.         WHILE @@FETCH_STATUS = 0
  236.         BEGIN
  237.             PRINT '         ' + @mount_number + ' ' + CAST(@group_number AS VARCHAR(10)) + ' ' + CAST(@startdate AS VARCHAR(12))
  238.             fetch @Groups_cursor INTO @mount_number, @group_number, @startdate
  239.         END
  240.         close @Groups_cursor
  241.  
  242.     print ' '
  243.     FETCH @Climbers_cursor INTO @climber_name
  244. END
  245. close @Climbers_cursor
  246. GO
  247.  
  248. -------------------------------------------------------------------------------
  249.  
  250. SELECT COUNT(*) AS coun, c.name, m.name FROM climbers AS c JOIN regs AS r ON r.climber_id = c.id JOIN mountains AS m ON m.id = r.mountain_id
  251. GROUP BY c.name, m.name
  252. ORDER BY coun DESC
  253. GO
  254.  
  255. -------------------------------------------------------------------------------
  256.  
  257. DROP FUNCTION get_groups
  258. DROP FUNCTION get_group_p
  259. GO
  260.  
  261. CREATE FUNCTION get_groups(@sdate DATE, @edate DATE)
  262. RETURNS @groups TABLE
  263. (
  264.     group_id INT NOT NULL
  265. )
  266. AS
  267. BEGIN
  268.     INSERT @groups
  269.     SELECT DISTINCT r.group_id FROM regs AS r WHERE
  270.         DATEDIFF(DAY, @sdate, r.startdate) >= 0 AND DATEDIFF(DAY, r.enddate, @edate) >= 0
  271.     RETURN;
  272. END;
  273. GO
  274.  
  275. CREATE FUNCTION get_group_p(@sdate DATE, @edate DATE, @group_id INT)
  276. RETURNS @paticipants TABLE
  277. (
  278.     name VARCHAR(30)
  279. )
  280. AS
  281. BEGIN
  282.     INSERT @paticipants
  283.     SELECT c.name FROM regs AS r JOIN climbers AS c ON c.id = r.climber_id
  284.         WHERE r.group_id = @group_id AND
  285.         (DATEDIFF(DAY, @sdate, r.startdate) >= 0 AND DATEDIFF(DAY, r.enddate, @edate) >= 0)
  286.     RETURN;
  287. END;
  288. GO
  289.  
  290. ---
  291.  
  292. DECLARE @sdate DATE = '2000-01-01'
  293. DECLARE @edate DATE = '2015-01-01'
  294.  
  295. ------
  296.  
  297. DECLARE @Group_cursor CURSOR
  298. SET @Group_cursor = CURSOR
  299. FOR
  300.     SELECT * FROM get_groups(@sdate, @edate)
  301. OPEN @Group_cursor
  302.  
  303. DECLARE @group_id INT,
  304.         @climber_name VARCHAR(30)
  305.  
  306. FETCH @Group_cursor INTO @group_id
  307. WHILE @@FETCH_STATUS = 0
  308. BEGIN
  309.     PRINT '-----------------------'
  310.     print @group_id
  311.  
  312.         DECLARE @Pat_cursor CURSOR
  313.         SET @Pat_cursor = CURSOR
  314.         FOR
  315.             SELECT * FROM get_group_p(@sdate, @edate, @group_id)
  316.         OPEN @Pat_cursor
  317.         fetch @Pat_cursor INTO @climber_name
  318.         IF @@FETCH_STATUS <> 0
  319.         PRINT '         <<None>>'    
  320.         WHILE @@FETCH_STATUS = 0
  321.         BEGIN
  322.             PRINT '         ' + @climber_name
  323.             fetch @Pat_cursor INTO @climber_name
  324.         END
  325.         close @Pat_cursor
  326.  
  327.     print ' '
  328.     FETCH @Group_cursor INTO @group_id
  329. END
  330. close @Group_cursor
  331. GO
  332.  
  333. --------------------------------------------------------------------------------------------
  334.  
  335. SELECT m.name, COUNT(r.climber_id) FROM regs AS r JOIN mountains AS m ON m.id = r.mountain_id
  336. GROUP BY m.name
  337. ORDER BY m.name
  338. GO
  339.  
  340. ----------------------------------------------------------------------------------------------
  341.  
  342. DROP TABLE regs
  343. DROP TABLE mountain
  344. DROP TABLE climber
Advertisement
Add Comment
Please, Sign In to add comment