Advertisement
Guest User

Untitled

a guest
Dec 1st, 2015
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 11.81 KB | None | 0 0
  1. USE AKovrizhnykh
  2.  
  3. IF OBJECT_ID('Lab3.getGameForTeam') IS NOT NULL
  4.     DROP FUNCTION Lab3.getGameForTeam
  5. IF OBJECT_ID('Lab3.ShowScoreTable') IS NOT NULL
  6.     DROP PROCEDURE Lab3.ShowScoreTable
  7. IF OBJECT_ID('Lab3.missed') IS NOT NULL
  8.     DROP FUNCTION Lab3.missed
  9. IF OBJECT_ID('Lab3.scored') IS NOT NULL
  10.     DROP FUNCTION Lab3.scored
  11. IF OBJECT_ID('Lab3.win_count') IS NOT NULL
  12.     DROP FUNCTION Lab3.win_count
  13. IF OBJECT_ID('Lab3.draw_count') IS NOT NULL
  14.     DROP FUNCTION Lab3.draw_count
  15. IF OBJECT_ID('Lab3.calc_score') IS NOT NULL
  16.     DROP FUNCTION Lab3.calc_score
  17. IF OBJECT_ID('Lab3.GetWinWithEqualsScores') IS NOT NULL
  18.     DROP FUNCTION Lab3.GetWinWithEqualsScores
  19. IF OBJECT_ID('Lab3.GoalsOnGuest') IS NOT NULL
  20.     DROP FUNCTION Lab3.GoalsOnGuest
  21. IF OBJECT_ID('Lab3.GoalsDifferent') IS NOT NULL
  22.     DROP FUNCTION Lab3.GoalsDifferent
  23.  
  24. IF OBJECT_ID('Lab3.Stat') IS NOT NULL
  25.     DROP VIEW Lab3.Stat
  26. IF OBJECT_ID('Lab3.Rating') IS NOT NULL
  27.     DROP VIEW Lab3.Rating
  28.  
  29. IF OBJECT_ID('Lab3.Goals') IS NOT NULL
  30.         DROP TABLE Lab3.Goals
  31. IF OBJECT_ID('Lab3.Matches') IS NOT NULL
  32.         DROP TABLE Lab3.Matches
  33. IF OBJECT_ID('Lab3.Players') IS NOT NULL
  34.         DROP TABLE Lab3.Players
  35. IF OBJECT_ID('Lab3.Teams') IS NOT NULL
  36.         DROP TABLE Lab3.Teams
  37. IF OBJECT_ID('Lab3.CheckGoalKeeper') IS NOT NULL
  38.     DROP FUNCTION Lab3.CheckGoalKeeper
  39. IF OBJECT_ID('Lab3.IsMatchPlayer') IS NOT NULL
  40.     DROP FUNCTION Lab3.IsMatchPlayer
  41.  
  42.  
  43. IF EXISTS(SELECT * FROM sys.schemas WHERE name='Lab3')
  44.         DROP SCHEMA Lab3
  45. GO
  46. CREATE SCHEMA Lab3
  47. GO
  48.  
  49. CREATE TABLE Lab3.Teams (
  50.         id int IDENTITY(1,1),
  51.         name nvarchar(60),
  52.         country nvarchar(60),
  53.         CONSTRAINT PK_Teams_id PRIMARY KEY (id)
  54. )
  55. CREATE TABLE Lab3.Players (
  56.         id int IDENTITY(1,1),
  57.         name nvarchar(200),
  58.         number int,
  59.         team_id int,
  60.         CONSTRAINT PK_Players_id PRIMARY KEY (id),
  61.         CONSTRAINT FK_Players_team_id FOREIGN KEY (team_id) REFERENCES Lab3.Teams(id),
  62.         CONSTRAINT UK_Players_team UNIQUE (id, team_id)
  63. )
  64.  
  65. GO
  66. CREATE FUNCTION Lab3.CheckGoalkeeper(@playerId int, @teamId int)
  67. RETURNS bit
  68. BEGIN
  69.     RETURN IIF(EXISTS(SELECT * FROM Lab3.Players AS p WHERE p.id=@playerId AND p.team_id=@teamId), 1, 0);
  70. END
  71. GO
  72.  
  73. CREATE TABLE Lab3.Matches (
  74.         id int IDENTITY(1,1),
  75.         home_id int,
  76.         home_goalkeeper_id int,
  77.         guest_id int,
  78.         guest_goalkeeper_id int,
  79.         datetime datetime,
  80.         CONSTRAINT PK_Matches_id PRIMARY KEY (id),
  81.         CONSTRAINT FK_Matches_home_id FOREIGN KEY (home_id) REFERENCES Lab3.Teams(id),
  82.         CONSTRAINT FK_Matches_guest_id FOREIGN KEY (guest_id) REFERENCES Lab3.Teams(id),
  83.         CONSTRAINT FK_Matches_home_goalkeeper_id FOREIGN KEY (home_goalkeeper_id) REFERENCES Lab3.Players(id),
  84.         CONSTRAINT FK_Matches_guest_goalkeeper_id FOREIGN KEY (guest_goalkeeper_id) REFERENCES Lab3.Players(id),
  85.         CONSTRAINT CH_Matches_teams CHECK (home_id != guest_id),
  86.         CONSTRAINT UK_Matches_teams UNIQUE (home_id, guest_id),
  87.         CONSTRAINT CH_Matches_goalkeepers CHECK (Lab3.CheckGoalkeeper(home_goalkeeper_id, home_id) = 1 AND Lab3.CheckGoalkeeper(guest_goalkeeper_id, guest_id) = 1)
  88. )
  89. GO
  90. CREATE FUNCTION Lab3.IsMatchPlayer(@playerId int, @matchId int)
  91. RETURNS bit
  92. BEGIN
  93.     DECLARE @home int = (SELECT home_id FROM Lab3.Matches WHERE id=@matchId);
  94.     DECLARE @guest int = (SELECT guest_id FROM Lab3.Matches WHERE id=@matchId);
  95.     RETURN IIF(
  96.         EXISTS(SELECT * FROM Lab3.Players WHERE id=@playerId AND team_id=@home) OR EXISTS(SELECT * FROM Lab3.Players WHERE id=@playerId AND team_id=@guest),
  97.         1, 0
  98.     );
  99. END
  100. GO
  101. CREATE TABLE Lab3.Goals (
  102.         id int IDENTITY(1,1),
  103.         match_id int,
  104.         time time,
  105.         attacker_id int,
  106.         home_or_guest bit,
  107.         CONSTRAINT PK_Goals_id PRIMARY KEY (id),
  108.         CONSTRAINT FK_Goals_match_id FOREIGN KEY (match_id) REFERENCES Lab3.Matches(id),
  109.         CONSTRAINT FK_Goals_attacker_id FOREIGN KEY (attacker_id) REFERENCES Lab3.Players(id),
  110.         CONSTRAINT CH_Golas_valid_author CHECK (1=Lab3.IsMatchPlayer(attacker_id, match_id))
  111. )
  112.  
  113. INSERT INTO Lab3.Teams VALUES
  114.         ('Спартак', 'Россия'),
  115.         ('ЦСКА', 'Россия'),
  116.         ('Рубин', 'Россия'),
  117.         ('Зинит', 'Россия')
  118.  
  119. INSERT INTO Lab3.Players VALUES
  120.         -- Спартак
  121.         ('Артём Ребров', 32, 1), -- 1
  122.         ('Сердар Таски', 35, 1),
  123.         ('Евгений Макеев', 34, 1),
  124.         ('Сергей Паршивлюк', 4, 1),
  125.         ('Сальваторе Боккетти', 16, 1),
  126.         ('Дмитрий Комбаров', 23, 1),
  127.         ('Денис Глушаков', 8, 1),
  128.         ('Роман Широков', 15, 1),
  129.         ('Квинси Промес', 24, 1),
  130.         ('Ивелин Попов', 71, 1),
  131.         ('Зе Луиш', 20, 1), -- 11
  132.         -- ЦСКА
  133.         ('Игорь Акинфеев', 35, 2), -- 12
  134.         ('Марио Фернандес', 2, 2),
  135.         ('Сергей Игнашевич', 4, 2),
  136.         ('Алексей Березуцкий', 6, 2),
  137.         ('Зоран Тошич', 7, 2),
  138.         ('Александр Головин', 60, 2),
  139.         ('Александр Цауня', 19, 2),
  140.         ('Виктор Васин', 5, 2),
  141.         ('Понтус Вернблум', 3, 2),
  142.         ('Карлос Страндберг', 97, 2),
  143.         ('Кирилл Панченко', 8, 2), -- 22
  144.         -- Рубин
  145.         ('Сергей Рыжиков', 1, 3), -- 23
  146.         ('Руслан Камболов', 88, 3),
  147.         ('Соломон Кверквелия', 5, 3),
  148.         ('Олег Кузьмин', 2, 3),
  149.         ('Эльмир Набиуллин', 3, 3),
  150.         ('Благой Георгиев', 77, 3),
  151.         ('Магомед Оздоев', 27, 3),
  152.         ('Гёкдениз Карадениз', 61, 3),
  153.         ('Карлос Эдуардо', 10, 3),
  154.         ('Максим Канунников', 99, 3),
  155.         ('Марко Девич', 11, 3), -- 33
  156.         -- Зенит
  157.         ('Юрий Лодыгин', 1, 4), -- 34
  158.         ('Эсекьель Гарай', 24, 4),
  159.         ('Николас Ломбертс', 6, 4),
  160.         ('Игорь Смольников', 19, 4),
  161.         ('Доменико Кришито', 4, 4),
  162.         ('Хави Гарсия', 21, 4),
  163.         ('Аксель Витсель', 28, 4),
  164.         ('Данни', 10, 4),
  165.         ('Халк', 7, 4),
  166.         ('Артём Дзюба', 22, 4),
  167.         ('Павел Долгов', 92, 4) -- 44
  168.  
  169. -- Спартак - Зенит
  170. INSERT INTO Lab3.Matches VALUES
  171.         (1, 1, 4, 34, GETDATE())
  172. INSERT INTO Lab3.Goals VALUES
  173.         (1, '0:30', 11, 1),
  174.         (1, '0:45', 10, 1),
  175.         (1, '0:56', 42, 0),
  176.         (1, '1:20', 43, 0)
  177.  
  178.  
  179. -- Зенит - Спартак
  180. INSERT INTO Lab3.Matches VALUES
  181.         (4, 34, 1, 1, GETDATE())
  182.  
  183. -- Спартак - ЦСКА
  184. INSERT INTO Lab3.Matches VALUES
  185.         (1, 1, 2, 12, GETDATE())
  186. INSERT INTO Lab3.Goals VALUES
  187.         (3, '0:23', 11, 1),
  188.         (3, '0:56', 22, 0),
  189.         (3, '01:23', 9, 1)
  190.  
  191.  
  192. -- ЦСКА - Рубин
  193. INSERT INTO Lab3.Matches VALUES
  194.         (2, 12, 3, 23, GETDATE())
  195. INSERT INTO Lab3.Goals VALUES
  196.         (4, '0:45', 33, 1),
  197.         (4, '0:46', 22, 0),
  198.         (4, '01:35', 32, 1)
  199.  
  200. -- Рубин - Спартак
  201. INSERT INTO Lab3.Matches VALUES
  202.         (3, 23, 1, 1, GETDATE())
  203. INSERT INTO Lab3.Goals VALUES
  204.         (5, '0:12', 31, 1),
  205.         (5, '0:33', 11, 0),
  206.         (5, '01:20', 30, 1),
  207.         (5, '1:23', 10  , 0),
  208.         (5, '1:25', 32, 1)
  209.  
  210. -- ЦСКА - Спартак
  211. INSERT INTO Lab3.Matches VALUES
  212.         (2, 12, 1, 1, GETDATE())
  213. INSERT INTO Lab3.Goals VALUES
  214.         (6, '0:36', 22, 1),
  215.         (6, '0:39', 21, 1)
  216.  
  217. -- Спартак - Рубин
  218. INSERT INTO Lab3.Matches VALUES
  219.         (1, 1, 3, 23, GETDATE())
  220. INSERT INTO Lab3.Goals VALUES
  221.         (7, '1:12', 5, 1),
  222.         (7, '1:29', 27, 0)
  223.  
  224. -- Рубин - Зенит
  225. INSERT INTO Lab3.Matches VALUES
  226.         (3, 23, 4, 34, GETDATE())
  227. INSERT INTO Lab3.Goals VALUES
  228.         (8, '0:56', 28, 1),
  229.         (8, '1:04', 38, 0)
  230.  
  231. -- Зенит - Рубин
  232. INSERT INTO Lab3.Matches VALUES
  233.         (4, 34, 3, 23, GETDATE())
  234. INSERT INTO Lab3.Goals VALUES
  235.         (8, '1:01', 39, 1),
  236.         (8, '1:12', 27, 0)
  237.  
  238. GO
  239. CREATE VIEW Lab3.Stat AS
  240. SELECT Home.id AS 'home_id', Home.name AS 'host', Guest.id AS 'guest_id', Guest.name AS 'guest',
  241.         (SELECT COUNT(*) FROM Lab3.Goals AS G WHERE G.match_id=M.id AND G.home_or_guest=1) AS 'host_goals',
  242.         (SELECT COUNT(*) FROM Lab3.Goals AS G WHERE G.match_id=M.id AND G.home_or_guest=0) AS 'guest_goals'
  243.                 FROM Lab3.Matches AS M
  244.         JOIN Lab3.Teams AS Home ON M.home_id=Home.id
  245.         JOIN Lab3.Teams AS Guest ON M.guest_id=Guest.id
  246.  
  247. GO
  248.  
  249. GO
  250. CREATE FUNCTION Lab3.getGameForTeam(@teamId int)
  251. RETURNS TABLE
  252. AS
  253. RETURN
  254. (
  255.     SELECT t.id,
  256.         IIF(
  257.             EXISTS(SELECT id FROM Lab3.Stat AS s WHERE s.home_id=t.id AND s.guest_id=@teamId),
  258.             (SELECT CONCAT(s.host_goals, ':', s.guest_goals) FROM Lab3.Stat AS s WHERE s.home_id=t.id AND s.guest_id=@teamId),
  259.             '-'
  260.         ) AS 'result' FROM Lab3.Teams AS t
  261. )
  262. GO
  263. CREATE FUNCTION Lab3.scored(@teamId int)
  264. RETURNS int
  265. AS
  266. BEGIN
  267.     RETURN (
  268.         SELECT ISNULL((SELECT SUM(s1.host_goals) FROM Lab3.Stat AS s1 WHERE s1.home_id = @teamId), 0) +
  269.             ISNULL((SELECT SUM(s2.guest_goals) FROM Lab3.Stat AS s2 WHERE s2.guest_id = @teamId), 0)
  270.     )
  271. END
  272. GO
  273. CREATE FUNCTION Lab3.missed(@teamId int)
  274. RETURNS int
  275. AS
  276. BEGIN
  277.     RETURN (
  278.         SELECT ISNULL((SELECT SUM(s1.host_goals) FROM Lab3.Stat AS s1 WHERE s1.guest_id = @teamId), 0) +
  279.             ISNULL((SELECT SUM(s2.guest_goals) FROM Lab3.Stat AS s2 WHERE s2.home_id = @teamId), 0)
  280.     )
  281. END
  282. GO
  283. CREATE FUNCTION Lab3.win_count(@teamId int)
  284. RETURNS int
  285. AS
  286. BEGIN
  287.     RETURN (
  288.         (SELECT COUNT(*) FROM Lab3.Stat WHERE (home_id = @teamId AND host_goals > guest_goals) OR (guest_id = @teamId AND host_goals < guest_goals))
  289.     )
  290. END
  291. GO
  292. CREATE FUNCTION Lab3.draw_count(@teamId int)
  293. RETURNS int
  294. AS
  295. BEGIN
  296.     RETURN (
  297.         (SELECT COUNT(*) FROM Lab3.Stat WHERE (guest_id = @teamId OR home_id = @teamId) AND host_goals = guest_goals)
  298.     )
  299. END
  300. GO
  301. CREATE FUNCTION Lab3.calc_score(@teamId int)
  302. RETURNS int
  303. AS
  304. BEGIN
  305.     RETURN 3*Lab3.win_count(@teamId) + Lab3.draw_count(@teamId);
  306. END
  307. GO
  308.  
  309. CREATE PROCEDURE Lab3.ShowScoreTable
  310. AS BEGIN
  311.     DECLARE @table_query nvarchar(4000) = 'SELECT name AS [ ]';
  312.     SELECT @table_query += CONCAT(', team', t.id, '.result AS [', t.name, ']') FROM Lab3.Teams AS t;
  313.     SELECT @table_query += ' FROM Lab3.Teams AS t';
  314.     SELECT @table_query += CONCAT(' JOIN Lab3.getGameForTeam(', t.id, ') AS team', t.id, ' ON team', t.id, '.id=t.id') FROM Lab3.Teams AS t;
  315.     EXEC(@table_query);
  316. END
  317.  
  318. GO
  319. CREATE FUNCTION Lab3.GetWinWithEqualsScores(@teamId int)
  320. RETURNS int
  321. BEGIN
  322.     DECLARE @score int = Lab3.calc_score(@teamId);
  323.     DECLARE @result int = (SELECT COUNT(*) FROM Lab3.Stat AS s WHERE (s.home_id=@teamId AND Lab3.calc_score(s.guest_id)=@score AND s.host_goals > s.guest_goals) OR
  324.         (s.guest_id=@teamId AND Lab3.calc_score(s.home_id)=@score AND s.host_goals < s.guest_goals))
  325.     RETURN @result;
  326. END
  327.  
  328. GO
  329. CREATE FUNCTION Lab3.GoalsOnGuest(@teamId int)
  330. RETURNS int
  331. BEGIN
  332.     RETURN (SELECT COUNT(s.guest_goals) FROM Lab3.Stat AS s WHERE s.guest_id=@teamId);
  333. END
  334. GO
  335.  
  336. CREATE FUNCTION Lab3.GoalsDifferent(@teamId int)
  337. RETURNS int
  338. BEGIN
  339.     DECLARE @scored int = (SELECT SUM(s.host_goals) FROM Lab3.Stat AS s WHERE s.host_goals=@teamId) + (SELECT SUM(s.guest_goals) FROM Lab3.Stat AS s WHERE s.guest_goals=@teamId);
  340.     DECLARE @missed int = (SELECT SUM(s.guest_goals) FROM Lab3.Stat AS s WHERE s.host_goals=@teamId) + (SELECT SUM(s.host_goals) FROM Lab3.Stat AS s WHERE s.guest_goals=@teamId);
  341.     RETURN @scored - @missed;
  342. END
  343. GO
  344.  
  345. CREATE VIEW Lab3.Rating AS
  346. SELECT TOP(100)
  347.     t.name AS [ ],
  348.     Lab3.calc_score(t.id) AS 'Очки',
  349.     Lab3.scored(t.id) AS 'Забито',
  350.     Lab3.missed(t.id) AS 'Пропущено'
  351.     FROM Lab3.Teams AS t ORDER BY 2 DESC, Lab3.GetWinWithEqualsScores(t.id) DESC, Lab3.GoalsOnGuest(t.id) DESC, Lab3.GoalsDifferent(t.id) DESC;
  352. GO
  353.  
  354. SELECT * FROM Lab3.Rating;
  355. EXEC Lab3.ShowScoreTable;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement