» »

SQL vprašanje

SQL vprašanje

korenje3 ::

https://www.w3schools.com/sql/trysql.as...

SELECT [Orders].EmployeeID, [Orders].OrderDate, AVG([OrderDetails].Quantity) as Quantity FROM [Orders] INNER JOIN [OrderDetails] ON [Orders].OrderID = [OrderDetails].OrderID GROUP BY [Orders].EmployeeID, [Orders].OrderDate, Quantity ORDER BY Quantity DESC;


Mi lahko kdo pove, kako bi združil EmployeeID, ki bi prikazoval AVG količine za zadnjih 5 vnosov po datumu. Za vsak EmployeeID bi se moral izpisat zadnji datum od teh 5 podstavk za katere se dela povprečje. Filtrirat bi moral tudi časovno po datumu, tako da ne izpiše, če je starejše od nekega datuma.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

WizzardOfOZ ::

select . . .
where date = select max(date). . .

korenje3 ::

Rezultat bi moral biti enak kot je tale:

(select top 5 * from Orders where EmployeeID = 1 order by CustomerID desc) as a
union
(select top 5 * from Orders where EmployeeID = 2 order by CustomerID desc) as a
union
(select top 5 * from Orders where EmployeeID = 3 order by CustomerID desc) as a
...

sam to verjetno ni pravi pristop.

Verjetno nekaj takega:
select EmployeeID,CustomerID,OrderDate from Orders x1 where 
(select count(*) from Orders x2 where x2.EmployeeID = x1.EmployeeID and x2.CustomerID <= x1.CustomerID ) <= 4 order by EmployeeID asc;

samo da bi moral še sortirat po datumu.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Zgodovina sprememb…

  • spremenil: korenje3 ()

Tody ::

Že vprasanje je cudno. Z subquery se da resit marsikaj potem mas pa se over funkcijo. Samo vedit mores kaj hoces. Mogoče se kak top ali limit pride prav

Lonsarg ::

Ja ni čisto vse 100% dorečeno(si kot tipični naročnik ki šele ko je serviran z pravilnim rezultatim zna bolj točno definirati želje hehe), tudi vsebinsko malce nesmiselna, zakaj povprečje posamezne postavke in ne povprečje zadnjih orderjev?

No kakorkoli, jaz sem to rešil z uporabo over da dobim zadnjih 5 postavk ter z uporabo subquerija da nato kasneje naredim average, ker pa hočemo pregledno formatiramo subquery v obliko CTEjev, ne tista stara nepregledna sintaksa, seveda w3schools ne podpira vseh funkcij in tega ne boš moral izvesti :)
WITH FiltredSource AS (
SELECT
o.EmployeeID
, d.Quantity
, ROW_NUMBER() OVER (PARTITION BY o.EmployeeID, ORDER BY d.OrderDate DESC) AS OrderedByDate
FROM Orders o
INNER JOIN OrderDetails d ON d.OrderID = o.OrderID
WHERE d.OrderDate > '20190101'
)
SELECT
s.EmployeeID
, AVG(s.Quantity) AS AverageInLast5Positions
FROM FiltredSource s
WHERE s.OrderedByDate < 6 --do average on last 5
GROUP BY s. EmployeeID

Zgodovina sprememb…

  • spremenil: Lonsarg ()

korenje3 ::

Recimo imaš izdelke, datum prodaje in ceno.
Rad bi pa za vsak posamičen izdelek za prodajo zadnjih 3 let in povprečje 5 zadnjih cen, znotraj tega časovnega območja...
da se izpiše 1 row za vsak izdelek s povprečno ceno in zadnjim datumom.

sem sem šele potem videl da tista internetna stran ne prepozna rownumber().
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

Zgodovina sprememb…

  • spremenil: korenje3 ()

korenje3 ::

Ok to je to. Zakon.
Zdej imam microsoft SQL server management studio in se lepo vidi, kaj se zgodi z rownumber.

WITH FilteredSource AS (
SELECT       [Product].ProductName, [Order].TotalAmount, [Order].OrderDate
,ROW_NUMBER() OVER (PARTITION BY [Product].ProductName ORDER BY [Order].OrderDate DESC) AS OrderedByDate
FROM            Customer INNER JOIN
                         [Order] ON Customer.Id = [Order].CustomerId INNER JOIN
                         OrderItem ON [Order].Id = OrderItem.OrderId INNER JOIN
                         Product ON OrderItem.ProductId = Product.Id INNER JOIN
                         Supplier ON Product.SupplierId = Supplier.Id
WHERE [Order].OrderDate > CONVERT(datetime,'1.1.2014', 104)

) SELECT ProductName, TotalAmount, OrderDate, OrderedByDate
FROM FilteredSource
WHERE OrderedByDate < 6

--ORDER BY Product.ProductName DESC, [Order].TotalAmount DESC
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

korenje3 ::

Oziroma če grupiramo je še tole.

SELECT ProductName, AVG(TotalAmount) as AVGAmmount, MAX(OrderDate) FROM FilteredSource WHERE OrderedByDate < 6
GROUP BY ProductName
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

MrStein ::

Torej iščeš za MS SQL ?

No, za probati gre tule : http://sqlfiddle.com/ (če jim ni kaj crknilo)
Za Oracle pa je verjetno najbolje uporabljat njihov https://livesql.oracle.com (prvi ima na voljo oracle 11.2 ampak v preteklosti jim pogosto ni deloval)
Motiti se je človeško.
Motiti se pogosto je neumno.
Vztrajati pri zmoti je... oh, pozdravljen!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

SQL sortiranje JOIN

Oddelek: Programiranje
17797 (564) korenje3
»

SQL poizvedba

Oddelek: Programiranje
162617 (1962) awy
»

[C#,SQL]

Oddelek: Programiranje
5961 (874) JanOlMajti
»

Baza & c#

Oddelek: Programiranje
213728 (2786) xardas
»

[sql]-stevilka vrstic

Oddelek: Programiranje
12880 (743) bmandl

Več podobnih tem