3 строки уточнения SQL

У меня проблема с отчетом, который работает на сайте, где данные не обрабатываются должным образом. В частности, есть выпадающие настройки с tlist, датами From и To, студентами и спортом. Проблема связана с выпадающим или спортивным выпадающим списком.

Раскрывающийся

<select id="lt" name="lt">
<option value="-1" selected="selected">All Sports</option>
~[tlist_sql;
SELECT DISTINCT log.logtypeid, 
CASE WHEN log.subtype is null THEN ' ' ELSE log.subtype END subID, 
CASE WHEN ','||'~[gpv:lt]'||',' LIKE '%,' || log.subtype || '.' || CASE WHEN 
log.subtype is null THEN ' ' ELSE log.subtype END || ',%' THEN 'selected' ELSE '' END  isselected,
lt.Name logtype, 
CASE WHEN to_char(st.ValueT) is null THEN ' - NONE' ELSE ' - ' || to_char(st.ValueT)    END subtype
FROM log
INNER JOIN gen lt ON log.logtypeid = lt.id
LEFT OUTER JOIN gen st ON st.Name = to_char(lt.ID)
AND st.value = log.subtype
AND st.Cat = 'subtype'
WHERE lt.Cat = 'logtype'
AND log.logtypeid = '3935'
AND to_char(log.schoolid) like CASE WHEN ~(curschoolid) = 0 THEN '%' ELSE to_char(~(curschoolid)) END
ORDER BY subtype
              ;]
                <option value="~(logID;l).~(subtypeID;t)" ~(isselected;t)>~(LogType;t)~ (SubType;t)</option>
              [/tlist_sql]

Выход

~[tlist_sql;
SELECT s.Student_Number, s.grade_level, s.lastfirst student, to_char(st.ValueT) subtype, log.discipline_weapontype,
CASE WHEN log.discipline_hearingofficerflag = '1' THEN 'Yes' ELSE ' ' END as pp,
CASE WHEN log.discipline_weaponrelatedflag = '1' THEN 'Yes' ELSE ' ' END  as ss,
DBMS_LOB.SUBSTR(log.entry, 4000,1) Notes
FROM log
INNER JOIN students s ON log.studentid = s.id
~[if#cursel.~[gpv:studentID]=cur]INNER JOIN ~[temp.table.current.selection:students] temp ON temp.dcid=s.dcid[/if#cursel]
INNER JOIN gen lt ON log.logtypeid = lt.id
LEFT OUTER JOIN gen st ON st.Name = to_char(lt.ID)
AND st.value = log.subtype
AND st.Cat = 'subtype'
AND lt.Cat = 'logtype'
WHERE studentid IN
(SELECT studentid
FROM log
WHERE subtype IN
(SELECT subtype
FROM log
WHERE logtypeid = '3935'))
AND subtype IN ('29','43','100','101','102','104','105','106','107','109','110','111','112','113','114','115','116','117','119','120','121','122','123','125','126','127','128','129','130','131','132','133')
AND log.entry_date >= to_date('~[gpv:dateselect]','MM/DD/YYYY')
AND log.entry_date <= to_date('~[gpv:dateselect2]','MM/DD/YYYY')
AND 
~[if#cursel.~[gpv:studentID]#cur]
to_char(s.ID) LIKE CASE WHEN '~[gpv:studentID]' = '-1' THEN '%' ELSE '~[gpv:studentID]' END
[/if#cursel]
AND (
(','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.' || CASE WHEN log.subtype is null THEN ' ' ELSE log.subtype END || ',%')
OR (','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.-1,%')
OR (to_char(log.logtypeid) LIKE CASE WHEN to_char('~[gpv:lt]') = '-1' THEN '%' ELSE ','||to_char('~[gpv:lt]')||',' END)
  ) 
ORDER BY s.lastfirst, log.entry_date;alternatecolor]

<tr class="oddRow">
<td>~(count;-)</td>
<td name="stNumCol">~(stNum;t)</td>
<td name="gradeCol">~(grade;t)</td>
<td name="studentCol">~(Student;t)</td>
<td name="subtypeCol">~(st;t)</td>
<td name="dopCol">~(date of physical;t)&nbsp;</td>
<td name="ppCol">~(parent perm.;t)&nbsp;</td>
<td name="ssCol">~(student signa.;t)</td>
<td name="notesCol">~(notes;t)</td>
</tr>
[/tlist_sql]

Когда отчет запускается с выбранным All Sports, он вытягивает всех студентов, у которых есть спортивные журналы.

log.logtypeid = '3935'

или они также могут быть

log.subtype IN ('100','101','102','104','105','106','107','109','110','111','112','113','114','115','116','117','119','120','121','122','123','125','126','127','128','129','130','131','132','133')

Необходимо извлечь другой набор данных, подтипы "29" и "43", которые являются журналами работоспособности. Код 29 запрещает кому-либо возможность попробовать себя в спорте, а код 43 - ему.

Проблема

При запуске All Sports отображаются все учащиеся со спортивными журналами, а также отображаются коды этих учеников 29 и 43, но при выборе отдельного вида спорта из выпадающего списка не отображаются подтипы журнала здоровья этих учеников 29 и 43.

Любые советы или предложения будут оценены. Спасибо

1 ответ

Решение

Вот как читать символы, с которыми у вас проблемы:

  • || обозначает конкатенацию в Oracle (а также в таких языках, как Java и C#), поэтому в любом месте, где вы видите || между двумя утверждениями означает, что система читает их как одно.
  • Операторы case - это, по сути, операторы if/then для SQL. В кейсе определяется, что нужно исследовать, а затем когда и остальное указывает, что делать с конкретными сценариями.
  • Список операторов to_char ('') размещает определенное форматирование символов в окружающей строке, которая, скорее всего, используется для объединения метаданных.
  • % является символом подстановки, который требуется для операторов LIKE

Этот код имеет немного больше смысла, когда вы меняете форматирование:

AND (
    (','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.' || 
        CASE WHEN log.subtype is null 
        THEN ' ' 
        ELSE log.subtype 
        END || ',%')
 OR (','||to_char('~[gpv:lt]')||',' LIKE '%,' || to_char(log.logtypeid) || '.-1,%')
 OR (to_char(log.logtypeid) LIKE 
        CASE 
        WHEN to_char('~[gpv:lt]') = '-1' 
        THEN '%' 
        ELSE ','||to_char('~[gpv:lt]')||',' 
        END)  
) 

Так что в основном это проверка значений gpv:ltLIKE значения log.logtypeid а также log.subtype (когда есть подтип - он не равен нулю) OR это проверяет gpv:ltLIKElog.logtypeid.-1OR где log.logtypeidLIKE что-нибудь, когда gpv:lt = -1 или = к gpv:lt если нет = 1.

Обратите внимание, что я понятия не имею, что это значит для вашего приложения / отчета, поскольку я не понимаю логику того, что вы пытаетесь выполнить... но, надеюсь, это утверждение на английском языке выше поможет вам перевести вашу проблему.

Другие вопросы по тегам