Subject AW: [firebird-support] crosstab pivot query
Author Check_Mail

Hello Set,

 

Thank you, exactly, what I’m looking for.

 

Completet and with changed the d1 to tx:

 

with tmpPerson(manr, name) as

(select distinct a.manr, b.name

from tplanung a left join tsachbearbeiter b on a.manr = b.sbnr

where jahr = 2017 and monat = 9 order by b.name),

tmpDays(tag, manr, z) as

(select tag, manr, z

from tplanung

where jahr = 2017 and monat = 9)

select p.name, d1.z "1", d2.z "2", d3.z "3", d4.z "4", d5.z "5", d6.z "6",d7.z "7",

d8.z "8", d9.z "9",d10.z "10", d11.z "11", d12.z "12",d13.z "13", d14.z "14", d15.z "15",

d16.z "16", d17.z "17", d18.z "18",d19.z "19", d20.z "20", d21.z "21",d22.z "22", d23.z "23",

d24.z "24",d25.z "25", d26.z "26", d27.z "27",d28.z "28", d29.z "29", d30.z "30", d31.z "31"

from tmpPerson p

left join tmpDays d1 on p.manr = d1.manr and d1.tag = 1

left join tmpDays d2 on p.manr = d2.manr and d2.tag = 2

left join tmpDays d3 on p.manr = d3.manr and d3.tag = 3

left join tmpDays d4 on p.manr = d4.manr and d4.tag = 4

left join tmpDays d5 on p.manr = d5.manr and d5.tag = 5

left join tmpDays d6 on p.manr = d6.manr and d6.tag = 6

left join tmpDays d7 on p.manr = d7.manr and d7.tag = 7

left join tmpDays d8 on p.manr = d8.manr and d8.tag = 8

left join tmpDays d9 on p.manr = d9.manr and d9.tag = 9

left join tmpDays d10 on p.manr = d10.manr and d10.tag = 10

left join tmpDays d11 on p.manr = d11.manr and d11.tag = 11

left join tmpDays d12 on p.manr = d12.manr and d12.tag = 12

left join tmpDays d13 on p.manr = d13.manr and d13.tag = 13

left join tmpDays d14 on p.manr = d14.manr and d14.tag = 14

left join tmpDays d15 on p.manr = d15.manr and d15.tag = 15

left join tmpDays d16 on p.manr = d16.manr and d16.tag = 16

left join tmpDays d17 on p.manr = d17.manr and d17.tag = 17

left join tmpDays d18 on p.manr = d18.manr and d18.tag = 18

left join tmpDays d19 on p.manr = d19.manr and d19.tag = 19

left join tmpDays d20 on p.manr = d20.manr and d20.tag = 20

left join tmpDays d21 on p.manr = d21.manr and d21.tag = 21

left join tmpDays d22 on p.manr = d22.manr and d22.tag = 22

left join tmpDays d23 on p.manr = d23.manr and d23.tag = 23

left join tmpDays d24 on p.manr = d24.manr and d24.tag = 24

left join tmpDays d25 on p.manr = d25.manr and d25.tag = 25

left join tmpDays d26 on p.manr = d26.manr and d26.tag = 26

left join tmpDays d27 on p.manr = d27.manr and d27.tag = 27

left join tmpDays d28 on p.manr = d28.manr and d28.tag = 28

left join tmpDays d29 on p.manr = d29.manr and d29.tag = 29

left join tmpDays d30 on p.manr = d30.manr and d30.tag = 30

left join tmpDays d31 on p.manr = d31.manr and d31.tag = 31

 

 

Von: firebird-support@yahoogroups.com [mailto:firebird-support@yahoogroups.com]
Gesendet: Dienstag, 26. September 2017 10:33
An: firebird-support@yahoogroups.com
Betreff: Re: [firebird-support] crosstab pivot query

 

 

Hi Olaf!

 

Not quite crosstab, but knowing there is a maximum of 31 days in a month, you can simulate:

 

with tmpPerson(Person) as 

(select distinct person

 from tableA

 where month = 9),

tmpDays("day", person, sign) as

(select "day", person, sign

 from tableA

 where month = 9)

select p.person, list(d1.sign) day1, list(d2.sign) day2, list(d3.sign) day3, ... list(d30.sign) day30, list(d31.sign) day31

from tmpPerson p

left join tmpDays d1 on p.person = d1.person and d1."day" = 1

left join tmpDays d2 on p.person = d1.person and d1."day" = 2

left join tmpDays d3 on p.person = d1.person and d1."day" = 3

...

left join tmpDays d30 on p.person = d1.person and d1."day" = 30

left join tmpDays d31 on p.person = d1.person and d1."day" = 31 /*Not applicable for September, but I assume you want other months as well and it doesn't harm...*/

group by p.person

 

If no person has two records any given day, then you don't need 'list' and 'group by'.

 

Since SQL isn't very suitable for crosstab (*), I normally prefer to select - possibly with grouping - in Firebird and "crosstabbing" in Excel.

 

HTH,

Set

 

(*) My experience is more or less limited to Fb 2.5, but I cannot imagine how to prepare a statement with an unknown number of columns, in theory that could also mean an unknown number of parameters