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

    −118

    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
    SELECT x.org_spec_id, (
                    SELECT count(c.id) FROM customers c , government_customers_require gcr               
                    WHERE c.org_spec_id=x.org_spec_id AND gcr.customer_id=c.id                
                ) as bal_ins, 
                sum(x.type_b1) as type_b1, sum(x.type_b2) as type_b2, sum(x.type_b3) as type_b3, sum(x.bus_debit) as bus_debit,
                sum(x.gost_ac1) as gost_ac1, sum(x.gost_ac2) as gost_ac2, sum(x.nav_ac1) as nav_ac1, sum(x.nav_ac2) as nav_ac2,
                \'-\' as price1, \'-\' as price2, \'-\' as price3, \'-\' as price4, sum(x.scope_b1) as scope_b1,
                sum(x.scope_b2) as scope_b2, sum(x.scope_b3) as scope_b3, sum(x.scope_b4) as scope_b4, sum(x.scope_b5) as scope_b5,
                sum(x.scope_b6) as scope_b6, sum(x.add11) as add11, sum(x.add12) as add12, sum(x.add21) as add21, 
                sum(x.add22) as add22, sum(x.add23) as add23, sum(x.add31) as add31, sum(x.add32) as add32, sum(x.add33) as add33
                
                FROM (SELECT c.org_spec_id, b.id , c.id as bal_ins,
                case when bsd.id is not null then 1 else 0 end as bus_debit,
                case when bsd.id is null then case when bm.type_id = 1 then 1 else 0 end else 0 end as type_b1, 
                case when bsd.id is null then case when bm.type_id = 2 then 1 else 0 end else 0 end as type_b2, 
                case when bsd.id is null then case when bm.type_id = 3 then 1 else 0 end else 0 end as type_b3,            
                case when bsd.id is null AND bm.type_id = 1 then case when gst.accepted then 1 else 0 end else 0 end as gost_ac1,
                case when bsd.id is null AND bm.type_id = 1 then case when gst.accepted then 0 else 1 end else 0 end as gost_ac2,
                case when bsd.id is null AND bm.type_id = 1 then case when nav.id is not null then 1 else 0 end else 0 end as nav_ac1,
                case when bsd.id is null AND bm.type_id = 1 then case when nav.id is not null then 0 else 1 end else 0 end as nav_ac2,
                case when bsd.id is null AND b.scope_id = 2 then 1 else 0 end as scope_b1,
                case when bsd.id is null AND b.scope_id = 1 then 1 else 0 end as scope_b2,
                case when bsd.id is null AND b.scope_id = 3 then 1 else 0 end as scope_b3,
                case when bsd.id is null AND b.scope_id = 4 then 1 else 0 end as scope_b4,
                case when bsd.id is null AND b.scope_id = 6 then 1 else 0 end as scope_b5,
                case when bsd.id is null AND b.scope_id = 5 then 1 else 0 end as scope_b6,
                case when bsd.id is null then case when add1.id is not null then case when add1.selected_variant=\'on\' then 1 else 0 end else 1 end else 0 end as add11,
                case when bsd.id is null then case when add1.id is not null then case when add1.selected_variant=\'off\' then 1 else 0 end else 0 end else 0 end as add12,
                case when bsd.id is null then case when add2.id is not null then case when add2.selected_variant=\'on\' then 1 else 0 end else 0 end else 0 end as add21,
                case when bsd.id is null then case when add2.id is not null then case when add2.selected_variant=\'off\' then 1 else 0 end else 0 end else 0 end as add22,
                case when bsd.id is null then case when add2.id is not null then case when add2.selected_variant=\'no\' then 1 else 0 end else 1 end else 0 end as add23,
                case when bsd.id is null then case when add3.id is not null then case when add3.selected_variant=\'on\' then 1 else 0 end else 0 end else 0 end as add31,
                case when bsd.id is null then case when add3.id is not null then case when add3.selected_variant=\'off\' then 1 else 0 end else 0 end else 0 end as add32,
                case when bsd.id is null then case when add3.id is not null then case when add3.selected_variant=\'no\' then 1 else 0 end else 1 end else 0 end as add33

    Запостил: asfalanaft, 29 Мая 2012

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

    • показать все, что скрытоПервый нах.
      Ответить
    • показать все, что скрытоКстати, поставил жЫрный минус...
      Ответить
    • isnull отменили?
      Ответить
    • Сильно переусложнённые условия. Иногда от case нельзя отказаться, конечно. Но это какой-то ад.
      Ответить
    • Рахитектуру БД говную.
      А у писавшего запрос просто еще не прокачано умение декомпозиции.
      Ответить
      • показать все, что скрыто> ко-ко
        Ответить
      • Хуйню написал. По сцепке таблиц из запроса - никаких проблем не возникло, а вот какую-то говнологику человек решил тут написать.
        Ответить
        • > Хуйню написал.
          Где конкретно написал?
          В том, что архитектура БД - говно?
          По одним кейсам, которые городит автор запроса понятно, что она - говно. За некоторые "selfdescribed" имена полей можно архитектора слать лесом. Если честно, то воняет эта БД, как и большинство решений сделанных для гос. контор.
          Или в том, что у писавшего запрос не прокачано умение декомпозиции?
          Вы на 100% уверены, что проверять "case when bsd.id is null" надо именно столько раз?
          И Вы уверены, что нельзя написать SUM(CASE ...)?
          Ответить
          • Какая разница, как названы поля? Как вы поняли по ебанутым кейсам, о чем сами и упомянули, что архитектура - говно? Ни одного пруфа, пока слышно только кукарекание
            Ответить
            • > Какая разница, как названы поля?
              лолшто? Желаю, чтоб Вам лично прислали на доработку БД с именами таблиц типа dfasdf, rtyrtgh, tyjhghj, gfhhfg и полями в них colaaa, colbbb, colccc и без документации.
              > Как вы поняли по ебанутым кейсам, о чем сами и упомянули, что архитектура - говно?
              Элементарно, кейсы указывают на то, что для транспонирования таблицы (перевод строк в колонки) приходится изрядно изощрятся. Возможно, Вы не поверите, но можно архитектурно предусмотреть так, чтоб телодвижений было меньше. Смотрим сюда: "b.scope_id = 2 then 1 else 0 end as scope_b1," и "b.scope_id = 1 then 1 else 0 end as scope_b2," и тоже самое для 5 и 6. Это что? В справочнике 1, а в отчет идет как 2? Скажите, что это так сложилось исторически, то SCD Вам в помощь. Смотрим сюда "case when bsd.id is null". Идентификатор может быть NULL? Ересь, на костер.
              > Ни одного пруфа,
              Надеюсь, накормил Вас достаточно.
              > пока слышно только кукарекание
              Если Вы про "> ко-ко", то спешу огорчить Вас - Вы не в теме.

              И напоследок, хотел бы поинтересоваться у Вас, а что Вы лично считаете в Вашем старт топике говнокодом?
              Ответить
              • За переворачивание таблицы в таких масштабах однозначно говную.
                Ответить
              • Вам не приходило в голову, что я в курсе, что такое транспонирование таблицы и что задачу, которую решали с помощью запроса, можно решить в разы элегантнее, и структура базы тут совершенно не при чем. Вы запрос прочтите, а потом попытайтесь проаргументировать еще раз.
                По поводу имен полей: исполнителю банально не удалось найти англоязычные аналоги для российских бюрократических реалий.
                Так что все еще ни одного пруфа.
                Ответить

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