Я автоматически строю SQL-запрос с использованием макроса VBA после пользовательского ввода. Запрос выглядит примерно так:
Select Distinct MATERIAL
From MyTABLE
Where (COND11) OR (COND12) OR COND13) OR (COND14)
OR (COND21) OR (COND22) OR (COND23)
Это дает мне все материалы, которые имеют тип кривой i. Условия CONDij
являются условиями для типа кривой i
. Это работает до здесь. У меня есть один тип кривой, где иногда только 1 точка на условие находится в базе данных. (В моем случае модуль Юнга против температуры, если в базе данных есть только комнатная температура, никакая кривая не может быть построена).
Теперь к вопросу. Как бы я сформулировал запрос, который выдает все материалы по крайней мере с двумя точками за условие. Черновик может выглядеть так:
Select Distinct MATERIAL
From MyTABLE
Where (COND11 AND (Select count(*) from MyTable Where COND11)>1) OR ... (same for other ij=
Я не получаю ошибку, она просто "не работает", что означает, что я все еще получаю кривые только с 1 точкой.
РЕДАКТИРОВАТЬ: У меня есть подозрение, что подзапрос: Select count(*) from MyTable Where COND11)>1
не ограничивается поиском Distinct Material
, который я ищу. Таким образом, запрос ищет отдельные материалы, но подзапрос подсчитывает количество записей любого материала, которые удовлетворяют условиям. Как бы я ограничил материал в подзапросе?
Вот полный вывод запроса в качестве примера. (Предупреждаю, это беспорядок)
Запрос
Select
Distinct ArticleIDEMS,
CompanyCDProd,
ArticleShort
From
V_Pruefungen
Where
(
(
(
PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
AND EINZELWERT = 'E-Modulus [MPa]'
AND BS_BEZEICHNUNG1 = '5'
AND ZUSTAND = 'conditioned'
)
AND (
Select
Count(*)
From
V_Pruefungen
Where
(
PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
AND EINZELWERT = 'E-Modulus [MPa]'
AND BS_BEZEICHNUNG1 = '5'
AND ZUSTAND = 'conditioned'
)
) > 2
)
OR (
(
PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
AND EINZELWERT = 'E-Modulus [MPa]'
AND BS_BEZEICHNUNG1 = '50'
AND ZUSTAND = 'conditioned'
)
AND (
Select
Count(*)
From
V_Pruefungen
Where
(
PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
AND EINZELWERT = 'E-Modulus [MPa]'
AND BS_BEZEICHNUNG1 = '50'
AND ZUSTAND = 'conditioned'
)
) > 2
)
OR (
(
PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
AND EINZELWERT = 'E-Modulus [MPa]'
AND BS_BEZEICHNUNG1 = '5'
AND ZUSTAND = 'dry'
)
AND (
Select
Count(*)
From
V_Pruefungen
Where
(
PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
AND EINZELWERT = 'E-Modulus [MPa]'
AND BS_BEZEICHNUNG1 = '5'
AND ZUSTAND = 'dry'
)
) > 2
)
OR (
(
PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
AND EINZELWERT = 'E-Modulus [MPa]'
AND BS_BEZEICHNUNG1 = '50'
AND ZUSTAND = 'dry'
)
AND (
Select
Count(*)
From
V_Pruefungen
Where
(
PRUEFBEDINGUNGEN = 'Tensile Test ISO 527'
AND EINZELWERT = 'E-Modulus [MPa]'
AND BS_BEZEICHNUNG1 = '50'
AND ZUSTAND = 'dry'
)
) > 2
)
)
EDIT:
Пример результата:
Перечисленные здесь материалы - это те, которые "имеют кривую" . Наличие кривой означает, что существует более 2 точек данных, которые заполняют один из нескольких наборов условий. Например, испытание на растяжение можно проводить при 5 мм / мин или при 50 мм / мин с сухим или кондиционированным состоянием образца. Это означает, что есть 4 возможных набора условий, которые позволяют кривой быть кривой растяжения. Теперь, если в одном из этих наборов условий более 2 точек, это кривая. Я знаю условия кривой, но я не знаю, как ограничить их двумя или более точками. Это вызывает проблемы для модуля упругости (E-Модуль) против кривой температуры. Если в базе данных есть свойство при 23 ° C, но ничего другого, кривая не может быть построена. Поскольку это относится к некоторым материалам, их следует исключить из запроса.
Я надеюсь, что эта разработка немного прояснила вопрос.