Как создать столбцы для разных полей без применения функции поворота - PullRequest
0 голосов
/ 29 мая 2018

Итак, у меня есть вопрос для крепких сердцем!У меня была проблема с этой концепцией некоторое время, и мне нужно ее очистить ... Следующий код показывает студентов, у которых более одного языка

SELECT DISTINCT s.studentnumber as studentnr, 
    p.firstname AS name,
    sl.gradenumber as gradenumber,
    string_agg(DISTINCT l.text, ', ') as languages

FROM student s
    JOIN pupil p ON p.id = s.pupilid    
    JOIN pupillanguage pl on pl.pupilid = p.id
    JOIN language l on l.id = pl.languageid
    JOIN schoollevel sl ON sl.id = p.schoollevelid

GROUP BY s.studentnumber, 
    p.firstname 

Результат

result1

Теперь мой вопрос прост, но я не уверен, каким будет ответ ... Я хочу разделить эти языки и поместить их в отдельные полятак что это выглядит примерно так

Требуемый результат

wantedresult

Существует также 1 серьезная проблема,Это использует Postgresql 9.3 , который теперь не позволяет группировать наборы, свертки или кубы.Однако я попробовал этот код, и он не работает должным образом, я не уверен, как с ним работать, и я не уверен, как идти дальше об этом ...

(select distinct l.text 
            from language 
            join pupillanguage pl2 on pl2.languageid = language.id 
            join pupil on p.id = pl2.personid
            limit 1) as language1

Так выглядят таблицыкак

Language Table 
iD                   PK
shorttext            char varying
text                 char varying

PupilLanguage Table

id                   PK
languageid           FK
personid             FK
displayorder         int

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Если у вас фиксированное количество столбцов, вы можете использовать массив:

select studentnr, name, gradenumber, 
       languages[1] as language_1,
       languages[2] as language_2,
       languages[3] as language_3,
       languages[4] as language_4,
       languages[5] as language_5
FROM (       
  SELECT s.studentnumber as studentnr, 
         p.firstname AS name,
         sl.gradenumber as gradenumber,
         array_agg(DISTINCT l.text) as languages
  FROM student s
      JOIN pupil p ON p.id = s.pupilid    
      JOIN pupillanguage pl on pl.pupilid = p.id
      JOIN language l on l.id = pl.languageid
      JOIN schoollevel sl ON sl.id = p.schoollevelid
  GROUP BY s.studentnumber, p.firstname
) t

Обратите внимание, что distinct обычно не требуется при использовании group by

0 голосов
/ 29 мая 2018

SQL-запрос возвращает фиксированное количество столбцов.Если вам нужно всего три дополнительных столбца, то вы можете использовать динамическое агрегирование:

with t as (
      SELECT s.studentnumber as studentnr, p.firstname AS name,
             sl.gradenumber as gradenumber, l.text as language,
             dense_rank() over (partition by s.studentnumber, p.firstname, sl.gradenumber order by l.text) as seqnum
      FROM student s JOIN 
           pupil p
           ON p.id = s.pupilid JOIN
           pupillanguage pl 
           ON pl.pupilid = p.id JOIN
           language l 
           ON l.id = pl.languageid JOIN
           schoollevel sl
           ON sl.id = p.schoollevelid
     )
select studentnr, name, gradenumber,
       max(case when seqnum = 1 then language end) as language_1,
       max(case when seqnum = 2 then language end) as language_2,
       max(case when seqnum = 3 then language end) as language_3
from t
group by studentnr, name, gradenumber;

Однако, если вам нужно переменное число, вам нужен crosstab или динамический SQL.Я мог бы также предложить вместо этого рассмотреть массивы.

...