1. SQL / Говнокод #21793

    −49

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    SELECT NVL(ГРУППЫ.НГ, 'ИТОГО') "ГРУППА", DECODE(GROUPING(ГРУППЫ.НГ), 0, AVG(ГРУППЫ.КОЛВО),
                                                                         1, (SELECT COUNT(НОМЕР_СТУДЕНТА) FROM СТУДЕНТ)) "КОЛ-ВО СТУДЕНТОВ", 
          DECODE(GROUPING(ГРУППЫ.НГ), 0, ГРУППЫ.НАЗВ_НАП,
                                      1, (SELECT LISTAGG(НАЗВАНИЕ_НАПРАВЛЕНИЯ, ', ') 
                                              WITHIN GROUP (ORDER BY НАЗВАНИЕ_НАПРАВЛЕНИЯ)
                                          FROM НАПРАВЛЕНИЕ
                                          WHERE КОД_НАПРАВЛЕНИЯ IN (SELECT КОД_НАПРАВЛЕНИЯ
                                                                    FROM ГРУППА))) "НАЗВАНИЕ СПЕЦИАЛЬНОСТИ", 
          COUNT(НОМ_СТУД)"КОЛ-ВО КРУГЛЫХ ОТЛИЧНИКОВ", 
       NVL(LISTAGG(ФАМ, ', ') WITHIN GROUP (ORDER BY ФАМ), ' ') "ФАМИЛИИ ОТЛИЧНИКОВ" 
    FROM                              
        (SELECT COUNT(*) КОЛВО, СТ.НОМЕР_ГРУППЫ НГ, НАП.НАЗВАНИЕ_НАПРАВЛЕНИЯ НАЗВ_НАП 
                          FROM СТУДЕНТ СТ LEFT OUTER JOIN                             
                                ГРУППА ГР ON СТ.НОМЕР_ГРУППЫ=ГР.НОМЕР_ГРУППЫ
                                LEFT OUTER JOIN НАПРАВЛЕНИЕ НАП ON НАП.КОД_НАПРАВЛЕНИЯ=ГР.КОД_НАПРАВЛЕНИЯ
                          GROUP BY СТ.НОМЕР_ГРУППЫ, НАП.НАЗВАНИЕ_НАПРАВЛЕНИЯ) ГРУППЫ
                      
    LEFT OUTER JOIN
        (SELECT СТ.НОМЕР_СТУДЕНТА НОМ_СТУД, СТ.НОМЕР_ГРУППЫ НОМ_ГРУП, НГ.КОД_НАПРАВЛЕНИЯ КОД_НАПР, СТ.ФАМИЛИЯ ФАМ, 5 СРЕД_ОЦЕНКА
        FROM СТУДЕНТ СТ INNER JOIN ГРУППА НГ ON СТ.НОМЕР_ГРУППЫ=НГ.НОМЕР_ГРУППЫ
                                    LEFT JOIN УЧЕБНЫЙ_ПЛАН УП ON НГ.КОД_НАПРАВЛЕНИЯ=УП.КОД_НАПРАВЛЕНИЯ
                                    LEFT JOIN УСПЕВАЕМОСТЬ УСП ON УСП.НОМЕР_СТУДЕНТА=СТ.НОМЕР_СТУДЕНТА AND УСП.НОМЕР_ДИСЦИПЛИНЫ=УП.НОМЕР_ДИСЦИПЛИНЫ       
        INTERSECT
        --ТАБЛИЦА "ПЕРВ"
        SELECT ВТОР.НОМЕР_СТУДЕНТА, ВТОР.Н_Г, ВТОР.КОД_НАПР, ВТОР.ФАМ, ВТОР.СРЕД_ОЦЕНКА 
        FROM  
            (SELECT КОД_НАПРАВЛЕНИЯ, COUNT(НОМЕР_ДИСЦИПЛИНЫ) CNT
            FROM УЧЕБНЫЙ_ПЛАН
            GROUP BY КОД_НАПРАВЛЕНИЯ) ПЕРВ
        INNER JOIN
        (SELECT НОМЕР_СТУДЕНТА, КОД_НАПР, Н_Г, ФАМ, COUNT(НОМ_ДИСЦИП) CNT, AVG(ОЦЕН) СРЕД_ОЦЕНКА
        FROM  
            (SELECT СТ.НОМЕР_СТУДЕНТА, ГР.НОМЕР_ГРУППЫ Н_Г, СТ.ФАМИЛИЯ ФАМ, УП.КОД_НАПРАВЛЕНИЯ КОД_НАПР, УС.НОМЕР_ДИСЦИПЛИНЫ НОМ_ДИСЦИП, УС.ОЦЕНКА ОЦЕН
            FROM УСПЕВАЕМОСТЬ УС INNER JOIN СТУДЕНТ СТ ON УС.НОМЕР_СТУДЕНТА=СТ.НОМЕР_СТУДЕНТА
                                LEFT OUTER JOIN ГРУППА ГР ON СТ.НОМЕР_ГРУППЫ=ГР.НОМЕР_ГРУППЫ
                                LEFT OUTER JOIN УЧЕБНЫЙ_ПЛАН УП ON ГР.КОД_НАПРАВЛЕНИЯ=УП.КОД_НАПРАВЛЕНИЯ AND УП.НОМЕР_ДИСЦИПЛИНЫ=УС.НОМЕР_ДИСЦИПЛИНЫ )
            INNER JOIN УЧЕБНЫЙ_ПЛАН УП2 ON УП2.КОД_НАПРАВЛЕНИЯ=КОД_НАПР AND УП2.НОМЕР_ДИСЦИПЛИНЫ=НОМ_ДИСЦИП
        GROUP BY НОМЕР_СТУДЕНТА, КОД_НАПР, Н_Г, ФАМ) ВТОР
        ON ПЕРВ.КОД_НАПРАВЛЕНИЯ=ВТОР.КОД_НАПР AND ПЕРВ.CNT=ВТОР.CNT ) ОТЛ
    ON ГРУППЫ.НГ=ОТЛ.НОМ_ГРУП
    GROUP BY GROUPING SETS((ГРУППЫ.НГ, ГРУППЫ.НАЗВ_НАП),());

    Запостил: ilgsha, 06 Декабря 2016

    Комментарии (18) RSS

    • 99% людей не умеет в OLAP кубы, и потому пишет отчеты руками.
      Это еще не самый ад. Бывает на 200 строк.

      Но я бы не хотел такое поддерживать, тем более что писали это разные люди судя по стилю: LEFT JOIN vs LEFT OUTER JOIN :)
      Ответить
      • ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ, БЛЯ!
        Ответить
    • где хоть это дерьмо писалось?
      Ответить
      • одна из задач курсовика.
        Ответить
        • Поцелуй меня в зад.
          Ответить
        • нет, я про среду. это оракл?
          Ответить
          • NVL как-бы намекает что да, это Оракл
            Ответить
            • ну хз конечно
              https://msdn.microsoft.com/ru-ru/library/x9xfsceh(v=vs.80).aspx
              https://www.ibm.com/support/knowledgecenter/en/SSGU8G_12.1.0/com.ibm.sqlt.doc/ids_sqt_151.htm
              Ответить
              • ой мама

                а я на ms-sql использовал IFNULL и почему-то думал что она там единственная
                Ответить
              • > listagg within group
                я так понимаю, уже сократили альтернативы до db2
                Ответить
                • а гугл говорит то и в оракле так можно
                  Ответить
                  • альтернативы ораклу
                    то, что это оракл у меня не было сомнений ещё и три дня назад

                    но сука заставлять детей называть таблицы и колонки на кириллице - это каким больным ублюдком надо быть
                    Ответить
                    • Так дети и сами могут.

                      В любой лабе есть переменные znachenie и kolichestvo
                      Ответить
                      • хм
                        а ведь и правда может быть не оракл

                        select 1 "НАЗВАНИЕ СПЕЦИАЛЬНОСТИ" from dual;
                        
                        ORA-00972: слишком длинный идентификатор
                        00972. 00000 -  "identifier is too long"
                        *Cause:    An identifier with more than 30 characters was specified.
                        *Action:   Specify at most 30 characters.
                        Ответить
                        • Это оракл, у вас другая кодировка может
                          Ответить
                      • > В любой лабе есть переменные znachenie и kolichestvo
                        более забавно, когда такие клёвые вещи передаются во внешних API федеральных ИС
                        Ответить
                        • > федеральных ИС
                          Ну плюсы тоже есть - термины из предметной области остаются as-is. За границей эти федеральные ИС никому нахуй не сдались. А XML парсеры всё стерпят, хоть на японском пиши теги.
                          Ответить

    Добавить комментарий