Låt säga att jag har en massa poster med ett datum och något numeriskt värde (belopp,antal el dyl). Dessutom finns ett kundnummer på raden. Alltså : Jag har för mig att den optimeras till att bara köras en gång per rad. Tyvärr blir det bara värre och värre, nu ser den ut så här : En metod är ju att göra aggregeringen på en nivå utanför. Exempel: Detta får jag inte att fungera, är det verkligen tillåtet syntax i T-SQL? Ja, förutsatt att fältnamn, udf mm är rätt, så kommer den att fungera rakt av... Jag testade nu igen och det fungerar klockrent. Jag måste ha missat något, kanske aliaset på subqueryn (dervierade tabellen)...tack!Gruppera på resultatet av en User Defined Function
<info>
Tabell : Reservationer
-------------------------
Kundnr int
Datum datetime
Belopp double
</info>
Nu vill skapa en rapport som är grupperad först per kund och sedan per vecka, där beloppet är summerat över veckan. Här är SQL:en som genererar korrekt resultat. Se [Omvandla datum till veckonummer (ISO)] för funktionen GetISOWeekNumber():
SELECT Kundnr, dbo.GetISOWeekNumber(Datum) as WeekNumber, SUM(Belopp)
FROM Reservationer
GROUP BY Kundnr, dbo.GetISOWeekNumber(Datum)
Detta fungerar men är detta det bästa sättet? Det som stör mig är att jag måste skriva funktionsanropet två gånger. Innebär detta att funktionen GetISOWeekNumber nu anropas två ggr per rad? Observera att det inte går att gruppera på aliaset WeekNumber.
Sv: Gruppera på resultatet av en User Defined Function
/mickeSv:Gruppera på resultatet av en User Defined Function
select GlobalCustomer_ID,
dbo.GetISOWeekNumber(ExpectedShippingDate) as WeekNumber,
SUM(Price)
from CustomerOrderDelivery
left join CustomerOrderRow on CustomerOrderRow.CustomerOrderRow_ID = CustomerOrderDelivery.CustomerOrderRow_ID
left join CustomerOrderHead on CustomerOrderHead.CustomerOrderHead_ID = CustomerOrderRow.CustomerOrderHead_ID
where dbo.GetISOWeekNumber(ExpectedShippingDate)<=dbo.GetISOWeekNumber(GetDate())+10
group by GlobalCustomer_ID, dbo.GetISOWeekNumber(ExpectedShippingDate)
order by GlobalCustomer_ID, dbo.GetISOWeekNumber(ExpectedShippingDate)
:-)
Sv: Gruppera på resultatet av en User Defined Function
<CODE>
SELECT Kundnr, WeekNumber, SUM(Belopp)
FROM
(
SELECT Kundnr, dbo.GetISOWeekNumber(Datum) as WeekNumber, Belopp
FROM Reservationer
) a
GROUP BY Kundnr, WeekNumber
</CODE>
/PelleSv:Gruppera på resultatet av en User Defined Function
Sv: Gruppera på resultatet av en User Defined Function
Den inre select-satsen brukar man kalla en "deriverad tabell" eller "inline view". Det är nödvändigt att ge denna ett alias, "a" efter parentesen i mitt exempel ovan.
Det är tillåten syntax, i såväl T-SQL som i ANSI-92-standarden.Sv:Gruppera på resultatet av en User Defined Function