#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)