14. november 2007 - 09:13Der er
11 kommentarer og 1 løsning
Ligge beløb sammen
Kære Eksperter,
Jeg har 3 tabeller:
"Dim_Date" Date_ID MonthNumber (Indeholder månedens nr... f.eks. jan=1) Year (f.eks. Year=2007) Year&Month (Indeholder både år og månedens navn... f.eks. "2007 - Juli")
"Customer" Customer_ID CustomerNumber (Indeholder et kundenr... f.eks. "08243") CustomerName (Indeholder kundensnavn... f.eks. "Mortens Bilvask")
Selv var jeg ude i noget med en subquery. Men får hele tiden dobbelt poster pga. flere beløb fra den samme Entry_Date_ID. Jeg håber I kan komme med en løsning?
Hvis du bruger SQL Server 2005, ville jeg først lavet en SQL der pivoter måneder ud som kolonner. Udenpå denne SQL, ville jeg lave en forespørgsel som akkumulerer YearToDate. Har ikke tid til at vise det nu, men ovenstående kan måske bruges som inspirationi. Hår måske tid til at se på det senere.
Det er en 2005 version jeg kører på. Har dog aldrig prøvet Pivot-funktionen... det ville være dejligt med et eksempel, for jeg er ikke helt sikker på hvad du mener med at pivoter måneder ud som kolonner?
Jeg har lige lavet et hurtig eksempel på en tabel der indeholder fire felter: Customer_id, Year, Month, Amount
SELECT Customer_id, Year,[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12] FROM ( SELECT Customer_id, Year, Month, Amount FROM dsa.dbo.Test ) p PIVOT ( SUM(Amount) FOR Month IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) ) AS pvt ORDER BY customer_id, Year
Et hurtig eksempel på hvordan denne kan udbygges (foreløbig kun lavet YTD for jan, feb og marts):
SELECT Customer_id , Year , Jan = [1] , Feb = [1]+[2] , Mar = [1]+[2]+[3] FROM ( SELECT Customer_id, Year,[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12] FROM ( SELECT Customer_id, Year, Month, Amount FROM dsa.dbo.Test ) p PIVOT ( SUM(Amount) FOR Month IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) ) AS pvt ) a
OBS! Du må bruge IsNull i summeringen, ellers vil NULL values ødelegge runningsum.
SELECT Customer_id , Year , Jan = IsNull([1],0) , Feb = IsNull([1],0)+IsNull([2],0) , Mar = IsNull([1],0)+IsNull([2],0)+IsNull([3],0) , Apr = IsNull([1],0)+IsNull([2],0)+IsNull([3],0)+IsNull([4],0) , May = IsNull([1],0)+IsNull([2],0)+IsNull([3],0)+IsNull([4],0)+IsNull([5],0) -- , Jun = IsNull([1],0),IsNull([2],0),IsNull([3],0),IsNull([4],0),IsNull([5],0),IsNull([6],0) FROM ( SELECT Customer_id, Year,[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12] FROM ( SELECT Customer_id, Year, Month, Amount FROM dsa.dbo.Test ) p PIVOT ( SUM(Amount) FOR Month IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) ) AS pvt ) a
Det giver ikke problem at der er flere år, dadu vil få en række for hvert år. Det kræves at du linker/joiner sammen alle tre tabeller, noget i retning af:
SELECT CustomerName , Year , Jan = IsNull([1],0) , Feb = IsNull([1],0)+IsNull([2],0) , Mar = IsNull([1],0)+IsNull([2],0)+IsNull([3],0) , Apr = IsNull([1],0)+IsNull([2],0)+IsNull([3],0)+IsNull([4],0) , May = IsNull([1],0)+IsNull([2],0)+IsNull([3],0)+IsNull([4],0)+IsNull([5],0) , Jun = IsNull([1],0),IsNull([2],0),IsNull([3],0),IsNull([4],0),IsNull([5],0),IsNull([6],0) FROM ( SELECT CustomerName, Year,[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12] FROM ( SELECT c.CustomerName, d.Year, d.MonthNumber, ce.OriginalAmount FROM Customer_Entry ce LEFT JOIN Dim_Date d ON ce.Entry_Date_ID = d.Date_ID LEFT JOIN Customer c ON ce.Customer_ID = c.Customer_ID ) p PIVOT ( SUM(OriginalAmount) FOR MonthNumber IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) ) AS pvt ) a
Rækken med ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]), forventer at MonthNumber indeholder ovenstående nummre for måneder. Ellers må du justere ovenstående.
Jeg tjekker det så snart jeg kan... er desværre ikke hjemme i aften har bare lige lånt en pc... var jo spændt på om der var noget godt og det ser sådan ud. :o)
Okay... lukker tråd Tak for Lorentsnv for forsøg på at hjælpe. Du må skrive, hvis du alligevel ønsker point, som tilbudt for 2 år siden, må du skrive.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.