Advertisement
madanska

select

Nov 17th, 2019
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 32.44 KB | None | 0 0
  1.  
  2. -------------------------------------------------------------------------------------------------------
  3. --------------------------------------------- Operator SELECT -----------------------------------------
  4. -------------------------------------------------------------------------------------------------------
  5. -- започваме с най-простата заявка, селектираме всичко от таблица
  6. SELECT * FROM COUNTRIES
  7. -------------------------------------------------------------------------------------------------------
  8. -- ORDER BY подрежда резултат по посочената колона във възх.ред ASC (default)/ низх.ред DESC.
  9. SELECT * FROM COUNTRIES ORDER BY NAME ASC
  10. SELECT * FROM COUNTRIES ORDER BY NAME DESC
  11.  
  12. -- забележете в резултатния набор, че след като се подреди възх. по номера на региона
  13. -- има и повтаряне на номера (напр.4), там вече се подрежда по COUNTRY_ID  в низх.ред
  14. SELECT * FROM COUNTRIES ORDER BY REGION_ID ASC, COUNTRY_ID DESC
  15.  
  16. -------------------------------------------------------------------------------------------------------
  17. --EMPLOYEES Подредени по фамилно име – възходящо и низходящо;
  18. SELECT * FROM EMPLOYEES ORDER BY LNAME ASC
  19. SELECT * FROM EMPLOYEES ORDER BY LNAME DESC
  20. -------------------------------------------------------------------------------------------------------
  21. -- задача:
  22. -- Всички данни за служителите със заплати над 12000 годишно;
  23. SELECT *
  24.   FROM EMPLOYEES
  25.  WHERE SALARY > 12000
  26.  -------------------------------------------------------------------------------------------------------
  27. -- задача:
  28. -- Общата сума на годишните заплати
  29. SELECT SUM(SALARY)              -- използваме агрегатна функция SUM()
  30.   FROM EMPLOYEES
  31.  
  32. -------------------------------------------------------------------------------------------------------
  33. -- задача:
  34. -- Общата сума от заплатите на всички служители, наети след определена дата
  35. SELECT SUM(SALARY)
  36.   FROM EMPLOYEES            
  37.  WHERE HIRE_DATE > '1998-06-21'
  38.  
  39. -------------------------------------------------------------------------------------------------------
  40. -- задача:
  41. -- Общата сума от заплатите на всички служители, групирани по отдели, където работят
  42. SELECT SUM(SALARY)
  43. FROM EMPLOYEES
  44. GROUP BY DEPARTMENT_ID
  45.  
  46. -- случва се следното: всички служители с еднакъв DEPARTMENT_ID стават група и заплатите им се сумират по група
  47.  
  48. -- в резултатния набор ни излизат числа, но не знaем на кой отдел съответстват, можем да го запишем в селекта
  49. -- При групиране в Select може да има освен агрегиращи функции и колоните, по които се групира.
  50. SELECT SUM(SALARY), DEPARTMENT_ID
  51. FROM EMPLOYEES
  52. GROUP BY DEPARTMENT_ID
  53.  
  54. -------------------------------------------------------------------------------------------------------
  55. -- задача:
  56. -- Общите суми на заплатите по отдели, средната заплата за всеки отдел, минимална и
  57. -- максимална заплата в отдел, както и брой на служители във всеки отдел (групирани по отдели).
  58.  
  59. SELECT DEPARTMENT_ID,
  60.        SUM(SALARY) AS SUM_SALARY,     -- as = alies , което буквално значи като, и слага име на колоната
  61.        AVG(SALARY)    AVG_SALARY,     -- може и да се пише as, може и да се пропусне as и да се напише само съкращението
  62.        MAX(SALARY)    [MAX SALARY],    
  63.        MIN(SALARY) AS [MIN SALARY],    
  64.        COUNT(*) --AS COUNT_EMP
  65. FROM EMPLOYEES
  66. GROUP BY DEPARTMENT_ID
  67.  
  68. -- Ще видите и надолу в примерите, че често пропускаме AS и изписваме само избраното от нас съкращение
  69. -- Целта да се използва, за да се именуват колони с No column name (както в COUNT(*) - виж резултата),
  70. -- за да дадем избрано от нас име на колона, която няма име в резултатния набор
  71.  
  72. --------------------------------------------------------------------------------------------------
  73.  
  74. -- задача:
  75. -- Всички клиенти, чието първо име е Fred
  76. SELECT *
  77.   FROM CUSTOMERS
  78.  WHERE FNAME = 'Fred'
  79.  
  80. -------------------------------------------------------------------------------------------
  81. -- задача:
  82. -- Всички клиенти, чиeто име започва с “Fre”.
  83. SELECT *
  84.   FROM CUSTOMERS
  85.  WHERE FNAME LIKE 'Fre%'            
  86.  
  87. -- операторът LIKE е разширение на сравняването на низове (=)
  88. -- като са добавени възможности за задаване на маски в низа, който се търси.
  89. -- Символът ‘%’ означава, че на негово място може да бъде произволен низ.
  90. -- В случая се намират всички низове, които започват с низа “Fre”.
  91.  
  92. -------------------------------------------------------------------------------------------------------
  93. -------------------------------------------Вложени заявки----------------------------------------
  94. -------------------------------------------------------------------------------------------------------
  95.  
  96. --Наричат се подзаявки, защото в една зяавка буквално се влага друга заявка и резултатът от вложената се използва
  97. --като операнд във външната. Това се дължи на факта, че резултатът от прилагането на релационен оператор е отново релация.
  98.  
  99. -- ЗАДАЧА 1:
  100. --Да се изведе име и фамилия на всички клиенти, които са от държави от регион 3.
  101.  
  102. SELECT FNAME, LNAME, COUNTRY_ID  
  103.   FROM CUSTOMERS
  104.  WHERE COUNTRY_ID IN (SELECT COUNTRY_ID        -- изпълнете само вътрешната заявка и вижте какво връща
  105.                         FROM COUNTRIES         -- връща COUNTRIES_ID-тата, които имат region_ID = 3,
  106.                        WHERE REGION_ID = 3 )          
  107.                                          
  108.                        
  109.  -- Външ.завка използва този резултат, за да ограничи крайният резултат само до тези клиенти,
  110.  -- чиито държави са сред върнатите от вложената заявка
  111.  
  112.  
  113. -------------------------------------------------------------------------------------------------------
  114. -------------------------------------------UNION----------------------------------------
  115. -------------------------------------------------------------------------------------------------------
  116. --Обединява резултати от 2 или повече заявки в един резултат(съдържащ всички редове от заявките)
  117.  
  118. --  Правила за резултатните набори, които обединяваме:
  119. --- Броят и редът на колоните на заявките, чиито резултати обединяваме, трябва да бъде еднакъв за всички заявки;
  120. --- Типовете данни на колоните, чиито данни обединяваме, трябва да бъдат съвместими, ако първата колона от заявките
  121. --  е число, то първите колони във всички заявки трябва да бъдат от числов тип, и така до последната колона от заявките;
  122. --- В целия израз може да присъства само една клауза ORDER BY накрая, сортираща всички обединени резултатни набори.
  123.  
  124. -- По подразбиране UNION премахва дублиращите се редове!
  125. -- Ако все пак искаме и тях използваме UNION ALL
  126.  
  127. -- ЗАДАЧА 2:
  128. -- Да се изведе информация за:
  129. -- а). Всички малки имена в нашата база;
  130. SELECT FNAME FROM CUSTOMERS
  131. UNION
  132. SELECT FNAME FROM EMPLOYEES
  133.  
  134.  
  135. -- b). Всички имена с евентуалните им повторения, сортирани в низходящ ред;
  136.   SELECT FNAME FROM CUSTOMERS
  137. UNION ALL
  138.   SELECT FNAME FROM EMPLOYEES
  139. ORDER BY 1 DESC
  140.  
  141. -- при UNION, ORDER BY може да бъде приложен само на обединения резултатен набор,
  142. -- не на отделните заявки. Понеже колоните в отделните заявки могат да имат различни имена,
  143. -- е позволено да укажем ORDER BY по индекс – пр.1 сортираме по първата колона от резултатния набор.
  144.  
  145.  
  146. -- c). Всички имена с добавена колона, която ще се изчислява от израз;
  147. -- тук е решението на задачата:
  148.   SELECT FNAME, 'Клиент (' + COUNTRY_ID + ')'  
  149.     FROM CUSTOMERS
  150. UNION
  151.   SELECT FNAME, 'Служител (' + CAST(DEPARTMENT_ID AS VARCHAR)+ ')'
  152.     FROM EMPLOYEES
  153. ORDER BY 2 DESC, 1 ASC
  154.  
  155.             ------------------------Обяснения относно решението на задачата:------------------------
  156.             -- Примера, който използвахме за пояснение на конкатерирането в първата част на обединението
  157.             SELECT 'Петър' + ' Петров'
  158.             SELECT 'Клиент (' + ' 1'+ ' )'
  159.  
  160.             -- конкатенираме низ + колона с идентификатори(напр: BG, US) + отново низ
  161.             SELECT 'Петър' + COUNTRY_ID + ' Петров' -- enter
  162.             FROM CUSTOMERS
  163.             --------------------------------------------------
  164.             -- Пояснение за втората част от обединението:
  165.             -- явно преобразуване на един тип в друг чрез скаларна функция CAST
  166.             SELECT CAST(DEPARTMENT_ID AS VARCHAR)      
  167.             FROM EMPLOYEES
  168.  
  169.             --в изразната колона се налага да преобразуваме явно стойността на колонота DEPARTMENT_ID до низ,
  170.             --за да няма двусмислие при прилагане на оператора +, т.е. да бъде интерпретиран като оператор за конкатенация.
  171.  
  172.             -- CAST изисква( израз КАТО тип, към който да се преобразува )
  173.             -- Случаен страничен пример за пояснение: SELECT CAST (2344 as varchar) + ' стая'
  174.  
  175.             -- ако изпробвате следната заявка ще се обедите, че без CAST ще даде грешка, защото DEPARTMENT_ID е int
  176.             -- спомнете си, и че има три условия за UNION
  177.             SELECT FNAME, 'Клиент (' + COUNTRY_ID + ')'  
  178.             FROM CUSTOMERS
  179.             UNION
  180.             SELECT FNAME, 'Служител (' + DEPARTMENT_ID + ')'
  181.             FROM EMPLOYEES
  182.  
  183. -------------------------------------------------------------------------------------------------------
  184. -- ЗАДАЧА 3:
  185. --Да се изведе информация за държавите и регионите, в които се намират:
  186.  
  187. -- нека започнем така
  188. SELECT * FROM COUNTRIES, REGIONS
  189.  
  190. -- получaваме резултат, който се състои от комбинациите на всеки запис от първата таблица с всеки от втората
  191. -- това е Декартово произведение на двете таблици или т.нар. CROSS JOIN. Естествено в този резултат има неверни данни.
  192. -- Искаме всяка страна да бъде комбинирана с единствения регион, в който тя действително се намира,
  193. -- т.е. искаме да останат само тези записи, които имат съвпадащи стойности в полетата REGION_ID от двете таблици
  194. -- Нека добавим това условие в WHERE клаузата на заявката.
  195.  
  196. -- решението е следното:
  197. SELECT * FROM COUNTRIES, REGIONS
  198. WHERE COUNTRIES.REGION_ID = REGIONS.REGION_ID
  199. -- в where клаузата добавихме просто условие за съпоставка.
  200.  
  201. -------------------------------------------------------------------------------------------------------
  202. -------------------------------------------5.3. Operator JOIN----------------------------------------
  203. -------------------------------------------------------------------------------------------------------
  204. -- Можем да съединим две или повече таблици чрез оператора JOIN. За разлика от UNION, чрез който
  205. -- обединявахме редовете от резултатните набори, с JOIN можем да обединим колоните на две или повече таблици.
  206.  
  207. --Припомнете си видовете съединения (погледнете диаграмите на Вен и mindmap):
  208. --1. CROSS JOIN – връща Декартово произведение на двете таблици.
  209. --2. INNER JOIN - използва се с оператор за сравнение на редове от две т-ци, базирано на стойностите в общи колони за всяка таблица
  210. --3. OUTER JOIN, може да бъде три вида:
  211.     --3.1. ляво  (LEFT OUTER JOIN или LEFT JOIN)- резултата ще включва всички редове от т-цата, отляво на JOIN, не само съвпадащите с дясната таблица.
  212.         -- Ако определен ред от лявата т-ца няма съвпадение в дясната, стойностите на колоните, идващи от дясната т-ца ще бъдат NULL.
  213.     --3.2. дясно (RIGHT OUTER JOIN или RIGHT JOIN) - обратен на left join – всички редове от дясната т-ца, а ако някой от тях няма
  214.         -- съвпадение в лявата таблица, стойностите на колоните, идващи от лявата таблица ще бъдат NULL.
  215.     --3.3. пълно (FULL OUTER JOIN или FULL JOIN) - всички редове от лявата и дясната т-ци. Ако някой от записите от едната таблица няма
  216.         -- съвпадение в другата таблица, колоните, които идват от другата таблица ще съдържат стойности NULL.
  217.  
  218. -------------------------------------------------------------------------------------------------------
  219. --ЗАДАЧА 4: Да се изведе информация за:
  220. -- а). Страните и регионите, в които се намират, включваща идентификатор, наименование на държава
  221.     -- и наименование на регион, в който се намира. Да се използва вътрешно съединение (тоест INNER JOIN)
  222.  
  223. -- ЩЕ преработим предната заявка така, че да използва JOIN за правилно извличане на данни от двете таблици.
  224.  
  225. SELECT COUNTRY_ID, COUNTRIES.NAME, REGIONS.NAME
  226. FROM COUNTRIES /*INNER*/ JOIN REGIONS
  227. ON COUNTRIES.REGION_ID = REGIONS.REGION_ID
  228.  
  229. -- Забележка: ако пропуснем ключовата дума INNER ще работи по същия начин, защото това е типът съединение по подразбиране.
  230. -- INNER JOIN включва САМО ЗАПИСИТЕ ОТ ТАБЛИЦИТЕ, КОИТО ИМАТ СЪОВЕТСТВИЯ. Така че в резултата няма да има региони, за които
  231. -- не е въведена поне една държава, също и държави, които не са причислени към никой от регионите.
  232.  
  233. -------------------------------------------------------------------------------------------------------
  234.  
  235. ---- b). В резултат да участват и регионите, за които НЯМА въведени страни:
  236.  
  237. -- Ще използваме външно съединение, за да бъдат запазени записите за регионите, които нямат съответни в таблицата с държавите.
  238. -- Избираме REGIONS за лява таблица и използваме LEFT OUTER JOIN, защото искаме всички записи от т-цата отляво на JOIN,
  239. -- комбинирани с евентуалните им съответни от т-цата отдясно на JOIN.
  240. -- /Същото ще се получи ако разменим местата на двете таблици и запишем RIGHT OUTER JOIN/- т.е. зависи коя т-ца е пред/зад JOIN
  241.  
  242. SELECT REGIONS.NAME, COUNTRY_ID, COUNTRIES.NAME
  243. FROM REGIONS LEFT OUTER JOIN COUNTRIES              
  244. ON REGIONS.REGION_ID = COUNTRIES.REGION_ID
  245.  
  246.  
  247. -- Изпълняваме заявката, скролваме надолу в резултатния набор и виждаме регион, който има NULL, което значи,
  248. -- че в региона няма въведени държави. За него стойностите от COUNTRIES са NULL.
  249.  
  250. -- За да направим резултатния набор по-прегледен може да използваме функция COALESCE, връщаща първия ненулев аргумент.
  251. -- (вместо NULL, виждаме символ -)
  252. SELECT REGIONS.NAME, COALESCE(COUNTRIES.COUNTRY_ID, '-'), COALESCE(COUNTRIES.NAME, '-')
  253. FROM REGIONS LEFT OUTER JOIN COUNTRIES            
  254. ON REGIONS.REGION_ID = COUNTRIES.REGION_ID
  255.  
  256.  
  257. -- c). Регионите и страните в тях. В резултатният набор да участват и регионите,
  258.     -- за които НЯМА въведени страни, както и страните, за които НЕ е указан регион:
  259.  
  260. SELECT COUNTRY_ID, COUNTRIES.NAME, REGIONS.NAME
  261. FROM REGIONS FULL OUTER JOIN COUNTRIES
  262. ON REGIONS.REGION_ID = COUNTRIES.REGION_ID
  263.  
  264. --Пояснение:
  265. -- в тази заявка се извършва пълно външно съединение на таблици в FROM клаузата.
  266. -- Това означава, че ще участват всички записи от лявата таблица REGIONS, като тези от тях,
  267. -- които нямат съответни в дясната таблица COUNTRIES ще имат стойности NULL в колоните,
  268. -- идващи от дясната таблица. Също ще участват всички записи от дясната таблица
  269. --REGIONS, като тези от тях, които нямат съответни в дясната таблица COUNTRIES ще имат стойности NULL
  270. -- в колоните, идващи от лявата таблица.
  271.  
  272. -------------------------------------------------------------------------------------------------------
  273. -- ЗАДАЧА 5:
  274. -- Извличане на първите 6 служители с най-ниска заплата;
  275. SELECT TOP 6 *                               -- TOP 6 връща 6 записа от резултатния набор.
  276. FROM EMPLOYEES
  277. ORDER BY SALARY  
  278.                                          
  279. -- За да вземем тези с най-ниските заплати сме извършили сортировка. Не сме записали след SALARY ASC, защото по подразбиране е
  280. -- ASC и значи, че реда е възходящ, така че първите 6 ще са с най-ниската заплата.
  281.  
  282. -------------------------------------------------------------------------------------------------------
  283. -- ЗАДАЧА 6:
  284. -- Обаче, ако има и други, които са с равна на 6-я служител заплата, ще се покажат с: WITH TIES
  285. SELECT TOP 6 WITH TIES *
  286. FROM EMPLOYEES
  287. ORDER BY SALARY
  288.  
  289. -------------------------------------------------------------------------------------------------------
  290. -- ЗАДАЧА 7: Да се изведат:
  291. -- a. Идентификаторите на продуктите и цените, на които са били поръчвани
  292.  
  293. SELECT OI.PRODUCT_ID, OI.UNIT_PRICE    
  294. FROM ORDER_ITEMS AS OI                 -- AS съкращава ORDER_ITEMS на избрано от нас съкращение , в случая OI, с цел да използваме съкращението вместо цялото и име
  295. ORDER BY  OI.PRODUCT_ID
  296.  
  297. --Пояснение:Тъй като някои продукти са поръчвани повече от веднъж на една и съща цена има дублиращи се редове в резултата.
  298.  
  299.  
  300. -- b. Дублажите се премахват с командата DISTINCT:
  301. SELECT DISTINCT OI.PRODUCT_ID, OI.UNIT_PRICE
  302. FROM ORDER_ITEMS OI
  303. ORDER BY OI.PRODUCT_ID
  304.  
  305. --c. Имената на продуктите, които са били поръчвани
  306. SELECT P.NAME
  307. FROM PRODUCTS P
  308. WHERE EXISTS (SELECT * FROM ORDER_ITEMS OI
  309.               WHERE OI.PRODUCT_ID = P.PRODUCT_ID)
  310. ORDER BY P.NAME
  311.  
  312. -- За всеки ред от външната заявка EXISTS тества за наличие на редове във вътрешната(която е обвързана с външната в WHERE клаузата си).
  313. -- Ако има редове – редът от външната ще участва в резултата.
  314.  
  315. -------------------------------------------------------------------------------------------------------
  316. -- ЗАДАЧА 8:
  317. -- Кой клиент колко поръчки е направил до момента.
  318.  
  319. SELECT C.FNAME, C.LNAME, COUNT(*) ords
  320. FROM CUSTOMERS C JOIN ORDERS O
  321. ON C.CUSTOMER_ID = O.CUSTOMER_ID
  322. GROUP BY C.FNAME, C.LNAME
  323. ORDER BY ords
  324.  
  325. -- заявката работи добре, стига да не искаме да видим тези, които до момента не са правили поръчки.
  326. -- Ако искаме всички клиенти - без значение поръчали или не, трябва да използваме външно съединение.
  327. -------------------------------------------------------------------------------------------------------
  328. -- ЗАДАЧА 9:
  329. -- Кой клиент колко поръчки е направил до момента.
  330. -- В резултата да участват и тези, които не са правили все още поръчки.
  331. SELECT C.FNAME, C.LNAME, COUNT(*) ords
  332. FROM CUSTOMERS C LEFT JOIN ORDERS O
  333. ON C.CUSTOMER_ID = O.CUSTOMER_ID
  334. GROUP BY C.FNAME, C.LNAME
  335. ORDER BY ords
  336.  
  337. -- Пояснение: излезе, че всеки е правил поне една поръчка. Това е подвеждащо заради
  338. -- неточността, която сме допуснали: COUNT(*) брои редовете, т.е. за всеки клиент наистина
  339. -- има поне един ред, но ще трябва да накараме функцията да преброи поръчките на клиента,
  340. -- т.е. да  брои ненулевите стойности за всеки
  341. -- клиент в някоя ненулева колона от поръчките: например COUNT(O.ORDER_ID).
  342.  
  343. SELECT C.FNAME, C.LNAME, COUNT(O.ORDER_ID) ords
  344. FROM CUSTOMERS C LEFT JOIN ORDERS O
  345. ON C.CUSTOMER_ID = O.CUSTOMER_ID
  346. GROUP BY C.FNAME, C.LNAME
  347. ORDER BY ords
  348.  
  349. -------------------------------------------------------------------------------------------------------
  350. -- ЗАДАЧА 10:
  351. --  Да се изведат всички данни за всички служители, подредени по фамилия във възходящ ред.
  352.  
  353. SELECT *
  354. FROM EMPLOYEES
  355. ORDER BY LNAME  
  356.  
  357. -------------------------------------------------------------------------------------------------------
  358. -- ЗАДАЧА 11:
  359. --  Да се изведат имената на всички служители и фамилията на прекия им началник, подредени по име на служителя.
  360.  
  361. --  Пояснение: относно таблица EMPLOYEES правим две aliases (спомнете си как създадохме EMPLOYEES)
  362. SELECT EMP.FNAME, EMP.LNAME, BOSS.LNAME
  363. FROM EMPLOYEES EMP JOIN EMPLOYEES BOSS
  364. ON EMP.MANAGER_ID = BOSS.EMPLOYEE_ID
  365. ORDER BY EMP.LNAME
  366.  
  367. -------------------------------------------------------------------------------------------------------
  368. -- ЗАДАЧА 12:
  369. -- Да се изведат имената на всички служители и фамилията на прекия им началник, подредени по име на служителя.
  370. -- Вкл. и служителите, КОИТО НЯМАТ началник, --> тоест ползваме външен join (LEFT OUTER JOIN)
  371. -- като за тях вместо нулева стойност в името на началника да има константен низ.
  372.  
  373. -- в случая низът е '<Няма шеф>' и когато изпълните заявката ще видите, че вместо NULL се изписва <Няма шеф>
  374.  
  375. SELECT EMP.FNAME, EMP.LNAME, ISNULL(BOSS.LNAME, '<Няма шеф>')
  376. FROM EMPLOYEES EMP LEFT JOIN EMPLOYEES BOSS
  377. ON EMP.MANAGER_ID = BOSS.EMPLOYEE_ID
  378. ORDER BY EMP.LNAME
  379.  
  380. -------------------------------------------------------------------------------------------------------
  381. -- ЗАДАЧА 13:
  382. -- Да се изведе информация за това кой служител кои поръчки е обработил.
  383. SELECT E.FNAME, E.LNAME, O.ORDER_ID
  384. FROM EMPLOYEES E JOIN ORDERS O
  385. ON E.EMPLOYEE_ID = O.EMPLOYEE_ID
  386. ORDER BY E.LNAME
  387.  
  388. -------------------------------------------------------------------------------------------------------
  389. -- ЗАДАЧА 14:
  390. -- Кой служител колко поръчки е обработил, подредени по броя на поръчките в низходящ ред.
  391. SELECT E.FNAME, E.LNAME, COUNT(*)
  392. FROM EMPLOYEES E LEFT JOIN ORDERS O
  393. ON E.EMPLOYEE_ID = O.EMPLOYEE_ID
  394. GROUP BY E.FNAME, E.LNAME
  395. ORDER BY 3 DESC          --в у-то подредени по бр. на поръчките в низх.ред. --COUNT(*) е 3-ти подред в селекта, затова пишем 3
  396.  
  397. -------------------------------------------------------------------------------------------------------
  398. -- ЗАДАЧА 15:
  399. -- Да се изведат всички служители, които са обработили над 4 поръчки до момента.
  400. SELECT E.FNAME, E.LNAME, COUNT(*)
  401. FROM EMPLOYEES E LEFT JOIN ORDERS O
  402. ON E.EMPLOYEE_ID = O.EMPLOYEE_ID
  403. GROUP BY E.FNAME, E.LNAME
  404. HAVING COUNT(*) > 4                                                  
  405. ORDER BY 3 DESC
  406.  
  407. -------------------------------------------------------------------------------------------------------
  408. -- ЗАДАЧА 16:
  409. -- Да се изведе детайлната част на поръчка с Order_ID = 2354
  410. SELECT *
  411. FROM ORDER_ITEMS
  412. WHERE ORDER_ID = 2354
  413.  
  414. -------------------------------------------------------------------------------------------------------
  415. -- ЗАДАЧА 17:
  416. -- Да се изведе общата сума на поръчка с Order_ID = 2354
  417.  SELECT SUM(UNIT_PRICE*QUANTITY)         -- сумираме единичната цена * количеството, за да получим общата сума    
  418.  FROM ORDER_ITEMS
  419.   WHERE Order_ID = 2354                  
  420.  
  421. -------------------------------------------------------------------------------------------------------
  422. -- ЗАДАЧА 18:
  423. -- Да се изведат всички поръчки с общата сума на ВСЯКА от тях.
  424. -- Добавяме просто условие за съпоставка в WHERE клаузата. Това е вътрешно съединение между използваните две таблици
  425.  
  426. SELECT O.ORDER_ID, O.ORDER_DATE, SUM(OI.UNIT_PRICE*OI.QUANTITY)
  427.   FROM ORDERS O, ORDER_ITEMS OI                  
  428.  WHERE O.ORDER_ID = OI.ORDER_ID                    
  429. GROUP BY O.ORDER_ID, O.ORDER_DATE
  430. -------------------------------------------------------------------------------------------------------
  431. -- ЗАДАЧА 19:
  432. -- Да се изведат правилите поръчки клиенти заедно с общия брой на поръчките и общата сума на поръчките,
  433. -- направени от всеки от тях, подредени в низходящ ред по сумата от поръчките.
  434.  
  435. -- Тук вместо две, имаме три таблици, затова условията в WHERE клаузата разделяме с AND
  436. --- COUNT (DISTINCT] expression) – Когато се използва DISTINCT връща броя на уникалните и различни от NULL стойности;
  437.  
  438. SELECT C.FNAME,
  439.        C.LNAME,
  440.        COUNT(DISTINCT O.ORDER_ID) Ords,            
  441.        SUM(OI.UNIT_PRICE*OI.QUANTITY) AS Total
  442.   FROM CUSTOMERS C, ORDERS O, ORDER_ITEMS OI              
  443.  WHERE C.CUSTOMER_ID = O.CUSTOMER_ID                
  444.    AND O.ORDER_ID = OI.ORDER_ID                    
  445.  GROUP BY C.FNAME, C.LNAME
  446.  ORDER BY Total DESC
  447.  
  448.  
  449.  -------------------------------------------------------------------------------------------------------
  450. -- ЗАДАЧА 20:
  451. -- Да се разшири предната задача, но само клиенти с поръчки на стойност над 100 000.
  452.  
  453. SELECT C.FNAME,
  454.        C.LNAME,
  455.        COUNT(O.ORDER_ID) Ords,
  456.        SUM(OI.UNIT_PRICE*OI.QUANTITY) AS Total
  457.   FROM CUSTOMERS C, ORDERS O, ORDER_ITEMS OI
  458.  WHERE C.CUSTOMER_ID = O.CUSTOMER_ID
  459.    AND O.ORDER_ID = OI.ORDER_ID
  460.  GROUP BY C.FNAME, C.LNAME
  461. HAVING SUM(OI.UNIT_PRICE*OI.QUANTITY) !< 100000            --  !< е знака за не по-малко
  462.  ORDER BY Total DESC
  463.  
  464. -------------------------------------------------------------------------------------------------------
  465. -- ЗАДАЧА 21:
  466. -- Да се изведат СЛУЖИТЕЛИТЕ, които са обработили поръчки за над 100 000.
  467.  
  468.     SELECT E.FNAME,
  469.            E.LNAME,
  470.            COUNT(O.ORDER_ID) Ords,
  471.            SUM(OI.UNIT_PRICE*OI.QUANTITY) AS Total
  472.       FROM EMPLOYEES E, ORDERS O, ORDER_ITEMS OI
  473.      WHERE E.EMPLOYEE_ID = O.EMPLOYEE_ID
  474.        AND O.ORDER_ID = OI.ORDER_ID
  475.   GROUP BY E.FNAME, E.LNAME
  476.     HAVING SUM(OI.UNIT_PRICE*OI.QUANTITY) > 100000
  477.   ORDER BY Total DESC
  478.  
  479. -------------------------------------------------------------------------------------------------------
  480. -- ЗАДАЧА 22:
  481. -- Да се изведат име на продукт и общо продадено количество за продукта.
  482.  
  483. SELECT P.NAME,
  484.        SUM(OI.QUANTITY) AS TotalSold
  485.   FROM PRODUCTS P, ORDER_ITEMS OI
  486.  WHERE P.PRODUCT_ID = OI.PRODUCT_ID
  487.  GROUP BY P.NAME
  488.  ORDER BY TotalSold DESC
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement