Необходимо изменить переменную data для использования в качестве «LIKE» в запросе COUNT

#sql #sql-server #count #sql-like

#sql #sql-сервер #count #sql-подобный

Вопрос:

Я пытаюсь использовать числовую переменную в операторе LIKE, но я не знаю, как изменить данные на числовое значение.

Прежде чем мы начнем, я прошу прощения, потому что я не могу скопировать структуру таблицы, поскольку я работаю с «средой SQL», которая не позволяет мне ее видеть, поэтому я сделаю все возможное, чтобы объяснить это.

У меня есть две таблицы:

  • ПРИМЕР таблицы

Код в таблице :

 SELECT sample_number,project,status,template,parent_aliquot,C_DUE_DATE_2
FROM SAMPLE
ORDER BY SAMPLE_NUMBER DESC
 

введите описание изображения здесь

  • KPS_SMP_DUE_DATE_WEEK_PIVOT_VW

Код в таблице:

 select *
from KPS_SMP_DUE_DATE_WEEK_PIVOT_VW
where project = 'S/180308/01'
 

Важными полями в этой таблице являются «ПРОЕКТ», «ПРОДУКТ» и «ГОД». Поля, отображаемые в правой части таблицы, не важны.

введите описание изображения здесь

У меня есть этот код :

 SELECT vw.project,vw.year,(SELECT COUNT(s.sample_number)
                                      FROM SAMPLE s
                                      WHERE s.PROJECT = vw.PROJECT AND s.STATUS IN ('I', 'U', 'P') and s.TEMPLATE = 'KPS_DEFAULT' AND s.PARENT_ALIQUOT > 0 
                                      and s.C_DUE_DATE_2 < {ts '2021-01-20 00:00:00'} and s.C_DUE_DATE_2 LIKE '%'vw.year'%')
FROM KPS_SMP_DUE_DATE_WEEK_PIVOT_VW vw
where vw.project = 'S/180308/01' and vw.department = 'QC'
 

Как было показано ранее, «KPS_SMP_DUE_DATE_WEEK_PIVOT_VW» содержит записи, классифицированные по полю «Год», поэтому я пытаюсь получить общее количество выборок, срок действия которых истек каждый год, используя этот код:

 SELECT COUNT(s.sample_number)
                                      FROM SAMPLE s
                                      WHERE s.PROJECT = vw.PROJECT AND s.STATUS IN ('I', 'U', 'P') and s.TEMPLATE = 'KPS_DEFAULT' AND s.PARENT_ALIQUOT > 0 
                                      and s.C_DUE_DATE_2 < {ts '2021-01-20 00:00:00'} and s.C_DUE_DATE_2 LIKE '%'vw.year'%'
 

Я бы хотел, чтобы ‘%’ vw.year’%’ работал, и ожидаемый результат был бы примерно таким :

Спасибо

введите описание изображения здесь

Ответ №1:

Вы можете использовать функцию YEAR or DATEPART следующим образом:

 YEAR(s.C_DUE_DATE_2) = vw.year
 

или

 DATEPART(YEAR,s.C_DUE_DATE_2) = vw.year
 

Ответ №2:

Вероятно, вам следует извлечь значение year из C_DUE_DATE_2 и сравнить это значение с vw.year

В вашем запросе измените

 s.C_DUE_DATE_2 LIKE '%'vw.year'%'
 

с

 YEAR(s.C_DUE_DATE_2) = vw.year
 

Ответ №3:

Если вы C_DUE_DATE_2 проиндексировали, то будет намного быстрее НЕ использовать YEAR функцию для нее. Вместо этого создайте интервал дат, охватывающий этот год:

 s.C_DUE_DATE_2 >= DATEFROMPARTS(vw.year, 1, 1)
    AND s.C_DUE_DATE_2 < DATEFROMPARTS(vw.year   1, 1, 1)