Stránka 1 z 1

Předělání SQL dotazu

Napsal: 28 říj 2013 15:00
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;

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

Napsal: 28 říj 2013 18:34
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 ;-)

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

Napsal: 28 říj 2013 19:06
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.

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

Napsal: 28 říj 2013 19:11
od CZechBoY
jo soráč, psal jsem to na rychlo :(
Tak to nevim, normálně by to v MySQL prošlo, zde už nepomohu :(