Advertisement
SquirrelInBox

ind

Dec 16th, 2015
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.98 KB | None | 0 0
  1. /*
  2. Задача 4. База данных фирмы, проводящей аукционы .
  3. Фирма занимается продажей с аукциона антикварных изделий и
  4. произведений искусства. Владельцы вещей, выставляемых на проводимых фирмой
  5. аукционах, юридически являются продавцами. Лица, приобретающие эти вещи,
  6. именуются покупателями. Получив от продавцов партию предметов, фирма решает,
  7. на котором из аукционов выгоднее представить конкретный предмет.
  8. Перед проведением очередного аукциона каждой из выставляемых на нем
  9. вещей присваивается отдельный номер лота. Две вещи,
  10. продаваемые на различных аукционах, могут иметь одинаковые номера лотов.
  11. В книгах фирмы делается запись о каждом аукционе. Там отмечаются дата,
  12. место и время его проведения, а также специфика (например,
  13. выставляются картины, на писанные маслом и не ранее 1900 г.).
  14. Заносятся также сведения о каждом продаваемом предмете:
  15. аукцион, на который он заявлен, номер лота, продавец, отправная цена
  16. и краткое словесное описание. Продавцу разрешается выставлять
  17. любое количество вещей, а покупатель имеет право приобретать
  18. любое количество вещей. Одно и то же лицо или фирма может выступать
  19. и как продавец, и как покупатель. После аукциона служащие фирмы,
  20. проводящей аукционы, записывают фактическую цену, уплаченную
  21. за проданный предмет, и фиксируют данные покупателя.
  22. Создать триггер для проверки того, что вещь в один день не находится
  23. на двух аукционах.
  24. Написать запросы, осуществляющие следующие операции:
  25. 1) Вывести список аукционов с указанием отсортированных по величине
  26. суммарных доходов от продажи.
  27. 2) Для указанного интервала дат вывести список проданных на аукционах
  28. предметов. Для каждого из предметов дать список аукционов,
  29. где выставлялся этот же предмет.
  30. 3) Для указанного интервала дат вывести список продавцов в порядке убывания
  31. общей суммы, полученной ими от продажи предметов в этот промежуток времени.
  32. 4) Для указанного места вывести список аукционов, отсортированных
  33. по количеству выставленных вещей.
  34. 5) Для указанного интервала дат вывести список продавцов, которые принимали участие в аукционах, с указанием для каждого из них списка выставленных предметов.
  35. 6) Вывести список покупателей с указанием количества приобретенных предметов в указанный период времени.
  36. */
  37.  
  38. USE master
  39. GO
  40.  
  41. IF EXISTS (
  42. SELECT name
  43. FROM sys.databases
  44. WHERE name = N'Auction'
  45. )
  46. ALTER DATABASE [Auction] set single_user with rollback immediate
  47. GO
  48.  
  49. IF EXISTS (
  50. SELECT name
  51. FROM sys.databases
  52. WHERE name = N'Auction'
  53. )
  54. DROP DATABASE [Auction]
  55. GO
  56.  
  57. CREATE DATABASE [Auction]
  58. GO
  59.  
  60. USE [Auction]
  61. GO
  62.  
  63. IF EXISTS(
  64. SELECT *
  65. FROM sys.schemas
  66. WHERE name = 'Auct'
  67. ) DROP SCHEMA Auct
  68. GO
  69.  
  70. CREATE SCHEMA Auct
  71. GO
  72.  
  73. if OBJECT_ID('clients', 'u') is not null
  74. drop table clients
  75. go
  76.  
  77. if OBJECT_ID('books', 'u') is not null
  78. drop table books
  79. go
  80.  
  81. if OBJECT_ID('goods', 'u') is not null
  82. drop table goods
  83. go
  84.  
  85. if OBJECT_ID('auct_type', 'u') is not null
  86. drop table auct_type
  87. go
  88.  
  89. if OBJECT_ID('lot', 'u') is not null
  90. drop table lot
  91. go
  92.  
  93. if OBJECT_ID('buy', 'u') is not null
  94. drop table buy
  95. go
  96.  
  97.  
  98. if OBJECT_ID('correct_data', 't') is not null
  99. drop trigger correct_data
  100. go
  101.  
  102.  
  103. create table clients(
  104. id int PRIMARY KEY IDENTITY NOT NULL,
  105. name nvarchar(128)
  106. )
  107. go
  108.  
  109. insert into clients values
  110. ('Фирма 1'),
  111. ('Фирма 2'),
  112. ('Фирма 3'),
  113. ('Фирма 4'),
  114. ('Фирма 5')
  115. go
  116.  
  117. select * from clients
  118. go
  119.  
  120.  
  121. create table auct_type(
  122. id int PRIMARY KEY IDENTITY NOT NULL,
  123. auct_type_name varchar(128) NOT NULL
  124. )
  125. go
  126.  
  127. insert into auct_type values
  128. ('Специфика 1'),
  129. ('Специфика 2'),
  130. ('Специфика 3'),
  131. ('Специфика 4')
  132. go
  133.  
  134.  
  135. create table books(
  136. id int PRIMARY KEY IDENTITY NOT NULL,
  137. auct_date date NOT NULL,
  138. auct_time time NOT NULL,
  139. auct_place varchar(128) NOT NULL,
  140. auct_type_id int NOT NULL
  141.  
  142. FOREIGN KEY (auct_type_id) REFERENCES auct_type(id)
  143. )
  144. go
  145.  
  146. insert into books values
  147. ('20150101', '12:00:00', 'Место 1', 1),
  148. ('20150102', '12:00:00', 'Место 2', 2),
  149. ('20150103', '12:00:00', 'Место 3', 4),
  150. ('20150104', '12:00:00', 'Место 4', 1),
  151. ('20150101', '13:00:00', 'Место 2', 1)
  152. go
  153.  
  154.  
  155. select * from clients
  156.  
  157. create table goods(
  158. id int PRIMARY KEY IDENTITY NOT NULL,
  159. name nvarchar(128) NOT NULL,
  160. seller int NOT NULL
  161.  
  162. FOREIGN KEY (seller) REFERENCES clients(id)
  163. )
  164. go
  165.  
  166. insert into goods values
  167. ('Вещь 1', 1),
  168. ('Вещь 2', 1),
  169. ('Вещь 1', 2),
  170. ('Вещь 1', 3),
  171. ('Вещь 1', 4),
  172. ('Вещь 5', 5)
  173. go
  174.  
  175.  
  176. create table lots(
  177. id int PRIMARY KEY IDENTITY NOT NULL,
  178. id_good int not null,
  179. id_lot int not null,
  180. id_auct int not null,
  181. start_cost float not null,
  182. descr_id int not null
  183.  
  184. FOREIGN KEY (id_good) REFERENCES goods(id),
  185. FOREIGN KEY (descr_id) REFERENCES auct_type(id),
  186. FOREIGN KEY (id_auct) REFERENCES books(id)
  187. )
  188. go
  189.  
  190.  
  191. create trigger correct_data ON lots AFTER INSERT AS
  192. begin
  193. select * from inserted
  194. select * from lots
  195. DECLARE @counter int = (
  196. SELECT count(*)
  197. FROM inserted
  198. INNER JOIN books AS IBooks ON IBooks.id = inserted.id_auct
  199. INNER JOIN lots ON lots.id_good = inserted.id_good
  200. INNER JOIN books AS CBooks ON CBooks.id = lots.id_auct
  201. WHERE inserted.id != lots.id and
  202. inserted.id_good = lots.id_good and
  203. IBooks.auct_date = CBooks.auct_date and
  204. IBooks.auct_place != CBooks.auct_place
  205. )
  206. IF @counter > 0
  207. BEGIN
  208. print ('В этот день товар уже выставлен на другом аукционе');
  209. ROLLBACK TRANSACTION;
  210. RETURN
  211. END
  212. end
  213. go
  214.  
  215. --плохо для триггера
  216. /*insert into lots values
  217. (1, 1, 1, 1, 1)
  218. go
  219. insert into lots values
  220. (1, 2, 5, 20, 4)
  221. go*/
  222.  
  223.  
  224.  
  225.  
  226. create table buy(
  227. fact_cost int not null,
  228. id_buyer int not null,
  229. id_good int not null,
  230. id_auct int not null
  231.  
  232. FOREIGN KEY (id_buyer) REFERENCEs clients(id),
  233. FOREIGN KEY (id_good) REFERENCES goods(id),
  234. FOREIGN KEY (id_auct) REFERENCES books(id)
  235. )
  236.  
  237.  
  238. --Вывести список аукционов с указанием отсортированных по величине суммарных доходов от продажи.
  239. SELECT id as 'Номер аукциона'
  240. FROM books AS CBooks
  241. ORDER BY (
  242. SELECT sum(fact_cost)
  243. FROM buy
  244. WHERE id_auct = CBooks.id
  245. )
  246. go
  247.  
  248.  
  249. --Для указанного интервала дат вывести список проданных на аукционах предметов. Для каждого из предметов дать список аукционов, где выставлялся этот же предмет.
  250. DECLARE @start date = '20010101'
  251. DECLARE @end date = '20151212'
  252. SELECT goods.name AS 'Проданный предмет',
  253. books.id AS 'Аукцион, на котором продали',
  254. (SELECT CBooks.id
  255. FROM lots
  256. INNER JOIN books AS CBooks ON CBooks.id = lots.id_auct
  257. WHERE lots.id_good = buy.id_good) AS 'Бывшие аукционы'
  258. FROM buy
  259. INNER JOIN goods ON buy.id_good = goods.name
  260. INNER JOIN books ON buy.id_auct = books.id
  261. GO
  262.  
  263.  
  264. --Для указанного интервала дат вывести список продавцов в порядке убывания общей суммы, полученной ими от продажи предметов в этот промежуток времени.
  265. DECLARE @start date = '20010101'
  266. DECLARE @end date = '20151212'
  267. SELECT clients.name
  268. FROM lots
  269. INNER JOIN goods ON goods.id = lots.id_good
  270. INNER JOIN clients ON clients.id = goods.seller
  271. INNER JOIN buy ON lots.id_good = buy.id_good
  272. ORDER BY (SELECT sum(lots.start_cost) FROM lots) --?????
  273. GO
  274.  
  275. --Для указанного места вывести список аукционов, отсортированных по количеству выставленных вещей
  276. DECLARE @place varchar(128) = 'Место 1'
  277. SELECT id
  278. FROM books
  279. WHERE auct_place = @place
  280. ORDER BY (SELECT count(*)
  281. FROM lots
  282. where lots.id_auct = id)
  283. GO
  284.  
  285. --Для указанного интервала дат вывести список продавцов, которые принимали участие в аукционах, с указанием для каждого из них списка выставленных предметов.
  286. DECLARE @start date = '20010101'
  287. DECLARE @end date = '20160101'
  288. SELECT clients.name AS 'Продавец',
  289. goods.name AS 'Выставленный предмет'
  290. FROM lots
  291. INNER JOIN goods ON goods.id = lots.id_good
  292. INNER JOIN clients ON goods.seller = clients.id
  293. INNER JOIN books ON books.id = lots.id_auct
  294. WHERE books.auct_date > @start and books.auct_date < @end
  295. go
  296.  
  297.  
  298. --Вывести список покупателей с указанием количества приобретенных предметов в указанный период времени.
  299. DECLARE @start date = '20010101'
  300. DECLARE @end date = '20160101'
  301. SELECT clients.name,
  302. (SELECT count(*) FROM buy AS CBuy WHERE CBuy.id_buyer = buy.id_buyer) AS 'Количество приобретенных предметов'
  303. FROM buy
  304. INNER JOIN clients ON buy.id_buyer = clients.id
  305. INNER JOIN books ON books.id = buy.id_auct
  306. WHERE books.auct_date > @start and books.auct_date < @end
  307. go
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement