Avatar billede dsjk Novice
20. september 2018 - 15:17 Der er 5 kommentarer og
1 løsning

Sum i forskellige kolonner

Hej,

Jeg har en tabel som denne
Period    Account    Amount
2018M1      25              10
2018M1      40              20
2018M2      30            30
2018M2      35              20
2018M2      90              50

Antallet af perioder kan varierer i løbet af året og min SELECT skal sættes op så den tager alle måneder indtil nu i året.

Der skal laves en sum med konti i rækkerne, og med P1-P12 i kolonnerne.
Der vil dermed være tal i flere kolonner som året skrider frem.

Af ovenstående skal jeg have
Account    P1    P2
123            25    65
456            40    90

Jeg synes jeg har forsøgt alt muligt med, case, variable Where etc. uden held.

Er der nogle der har et forslag/løsning på at skrive en SQL der kan lave overstående?

Pft.
20. september 2018 - 20:39 #1
Hvad er P1 - P12?
Avatar billede dsjk Novice
20. september 2018 - 20:54 #2
Det er periode 1 til periode 12 (jan-Dec i et givent år).

Jeg fandt en læsning ved at lave en variabel i sum og så tage alle perioder i året hver gang selvom jeg egentlig kun er i februar, men så vil den bare vise tomme kolonner, hvilket er helt fint.
20. september 2018 - 20:58 #3
Du kan gøre det i en dynamisk pivotering. Jeg viser det lige i morgen, så har jeg min computer hjemme :) Uden tomme kolonner :)
21. september 2018 - 09:03 #4
Som lovet:

drop table dbo.testperiods

Create  table dbo.testPeriods (Period nvarchar(50),account int, amount int)

insert into dbo.testPeriods
values

('2018M1',      25    ,        10 ),
('2018M1',      40    ,        20 ),
('2018M2',      30    ,        30 ),
('2018M2',      35    ,        20 ),
('2018M2',      90    ,        50 ),
('2018M2',      90    ,        50 ),
('2018M1',      90    ,        50 ),
('2018M3',      90    ,        50 )




DECLARE @Str NVARCHAR(MAX);
DECLARE @Str2 NVARCHAR(MAX);
SELECT @Str = STUFF(
                  (
                      SELECT DISTINCT
                              ','+QUOTENAME(Period)
                      FROM dbo.testPeriods FOR XML PATH('')
                  ), 1, 1, '');
PRINT @Str
SET @str2 = N'select * from (
  select Period,account,Amount
  from dbo.testPeriods
  )x
  PIVOT
  (
  sum(amount) FOR Period in ('+@Str+')
  ) as p';
PRINT @Str2;
EXEC (@Str2);


Dette er en løsning, som kun tager de perioder med du har. Du kan også indsætte et where filter på din periode, så du kun får det du vil have. Det essentielle er at den kun tager de perioder som du selv angiver i din stuff. Jeg ved ikke om din period er som den står 2018M1 fx eller om det rent faktisk er et dato felt. Jeg har tilladet mig at lave det som en string her i dette eksempel
21. september 2018 - 09:05 #5
Resultatet af ovenstående query:

account    2018M1    2018M2    2018M3
25                    10    NULL    NULL
30              NULL    30            NULL
35              NULL    20            NULL
40                  20    NULL    NULL
90                  50    100            50
21. september 2018 - 09:23 #6
Og lige en ekstra side note-. Hvis du vil have null replacet med 0 skal du gøre sådan her

DECLARE @Str NVARCHAR(MAX);
DECLARE @Str2 NVARCHAR(MAX);
DECLARE @StrCol NVARCHAR(MAX);

SET @StrCol =  STUFF(
                  (
                      SELECT DISTINCT
                            -- ',ISNULL('+QUOTENAME(Period)+',0) AS ' +QUOTENAME(Period)
                              ','+QUOTENAME(Period)
                      FROM dbo.testPeriods FOR XML PATH('')
                  ), 1, 1,'');
SELECT @Str = STUFF(
                  (
                      SELECT DISTINCT
                              ',ISNULL('+QUOTENAME(Period)+',0) AS ' +QUOTENAME(Period)
                              --','+QUOTENAME(Period)
                      FROM dbo.testPeriods FOR XML PATH('')
                  ), 1, 1,'');


PRINT @Str
PRINT @StrCol

SET @str2 = N'select Account,'+@Str+' from (
  select Period,account,Amount
  from dbo.testPeriods
  )x
  PIVOT
  (
  sum(amount) FOR Period in ('+@StrCol+')
  ) as p';
PRINT @Str2;
EXEC (@Str2);
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester