Předělání SQL dotazu

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Odpovědět
skb128
nováček
Příspěvky: 2
Registrován: 28 říj 2013 14:42

Předělání SQL dotazu

Příspěvek od skb128 »

Ahoj,
měl jsem za úkol vymyslet několik netriviálních dotazů na databázi Northwind a ty pak zapsat dvěma různými způsoby. Ideálně využitím vnořených selectů, které ovšem i přes veškerou snahu stále absolutně nezvládám. Nenašel by se tady někdo, kdo by zvládl následující dotazy předělat pomocí vnořených selectů tak, aby mi vracely stejný výsledek? Předem děkuji.

Kód: Vybrat vše

--1. Vypište jména společností z Německa nebo Brazílie, které učinily nejméně 10 objednávek, a počet těchto objednávek. Seřaďte vzestupně.

SELECT CompanyName AS 'Jméno společnosti', COUNT(Orders.OrderID) AS 'Počet objednávek'
FROM Customers LEFT OUTER JOIN Orders ON Customers.CustomerID = Orders.CustomerID
WHERE Country LIKE 'Germany' OR Country LIKE 'Brazil'
GROUP BY CompanyName HAVING COUNT(Orders.OrderID) >= 10
ORDER BY 'Počet objednávek' ASC;


--2. Vypište příjem z 20 nejvýnosnějších objednávek po aplikaci slevy, ID těchto objednávek a ID, jméno a příjmení zaměstnanců, kteří danou objednávku zpracovali. Setřiďte sestupně dle příjmu. Příjem zaokrouhlete na 1 desetinné místo.

SELECT TOP 20 [Order Details].OrderID AS 'ID objednávky', Orders.EmployeeID AS 'ID zaměstnance', Employees.FirstName AS 'Jméno', Employees.LastName AS 'Příjmení', ROUND(SUM([Order Details].UnitPrice * [Order Details].Quantity - ([Order Details].Quantity * [Order Details].UnitPrice * [Order Details].Discount)), 1) AS 'Příjem'
FROM [Order Details] LEFT OUTER JOIN Orders ON [Order Details].OrderID = Orders.OrderID LEFT OUTER JOIN Employees ON Employees.EmployeeID = Orders.EmployeeID
GROUP BY [Order Details].OrderID, Orders.EmployeeID, Employees.FirstName, Employees.LastName
ORDER BY 'Příjem' DESC;
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: Předělání SQL dotazu

Příspěvek od CZechBoY »

Zdravím,
to je jednoduchý :-) vezmeš sloupec, co chceš vybrat z joinu a vybereš ho přes vnořený dotaz.
Neznám Northwind databázi, dělám pouze s MySQL.

Kód: Vybrat vše

SELECT CompanyName AS 'Jméno společnosti',
   SELECT(COUNT(OrderID) FROM Orders WHERE Customers.CustomerID = Orders.CustomerID) AS 'Počet objednávek'
FROM Customers
WHERE Country LIKE 'Germany' OR Country LIKE 'Brazil'
GROUP BY CompanyName HAVING 'Počet objednávek' >= 10
ORDER BY 'Počet objednávek' ASC;


To druhý nevím jak se v Northwindu dělá, v MySQL není TOP operátor, dělá se to přes LIMIT klauzuli. Určitě to dokážeš sám přepsat po přepisu toho prvního dotazu ;-)
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
skb128
nováček
Příspěvky: 2
Registrován: 28 říj 2013 14:42

Re: Předělání SQL dotazu

Příspěvek od skb128 »

No ta závorka by nejspíš měla být před SELECT a ne před COUNT, ale i tak mi to potom nejde. Pise to "Column 'Customers.CustomerID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."

Ať dělám co dělám nedaří se mi prostě ten dotaz poskládat tak, aby mi fungoval. SQL se učím zhruba týden, ale tomuhle nemůžu přijít stále na kloub. Ale i tak dík, budu to dál zkoušet.
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: Předělání SQL dotazu

Příspěvek od CZechBoY »

jo soráč, psal jsem to na rychlo :(
Tak to nevim, normálně by to v MySQL prošlo, zde už nepomohu :(
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
Odpovědět

Zpět na „Programování a tvorba webu“