Я рассчитываю отходы на основе введенного количества, скорректированного с использованием поправочного коэффициента, считанного из таблицы.Ниже приведена структура таблиц с некоторыми примерами данных:
Администрации RMP:
Nuclide Product MBq Date Given
-------------------------------------------------
Tc-99m Pertechnetate 700 2018/01/01
I-131 NaI 399 2018/02/01
I-131 NaI 555 2018/01/01
I-123 MIBG 181 2018/01/01
I-123 NaI 29 2018/01/03
WasteFactors
Nuclide Product MinActivity MaxActivity Factor
------------------------------------------------------------
Tc-99m * 0.3
I-123 * 150 0.3
I-123 * 150 1
I-123 MIBG 0.6
I-131 * 400 0.5
I-131 * 400 1
Таким образом, эта таблица сложная, но онаЛучший способ представить поправочные коэффициенты в таблице.Сначала подбирается нуклид, затем, если продукт совпадает с тем, что используется поправочный коэффициент, наконец, мы проверяем активность (МБк) по столбцам Min / Max, чтобы принять решение.Затем мы используем этот коэффициент вместе с операцией для определения отходов, используя следующий SQL
SELECT
Nuclide,
[Date Given] AS Given,
(SELECT TOP 1
Factor
FROM WasteFactors
WHERE [RMP Administrations].Nuclide = WasteFactors.Nuclide
AND [RMP Administrations].Product LIKE WasteFactors.Product
AND (WasteFactors.MinActivity IS NULL
OR WasteFactors.MinActivity > [RMP Administrations].MBq)
AND (WasteFactors.MaxActivity IS NULL
OR WasteFactors.MaxActivity <= [RMP Administrations].MBq)
ORDER BY WasteFactors.Nuclide ASC, WasteFactors.Product DESC)
AS Waste
FROM [RMP Administrations] WHERE NOT [RMP Administrations].Nuclide IS NULL AND NOT [RMP Administrations].MBq IS NULL
. Таким образом, это позволяет добиться того, что нам нужно, путем сортировки таблицы факторов, чтобы факторы с названием продукта появлялись перед факторами, которые применяются квсе остальные продукты, поэтому с данными выше 'I-123 MIBG' проверяется перед 'I-123 *'.
, поэтому, выполнение этого SQL вместе с данными выше должно вернуть следующее:
Nuclide Given Waste
--------------------------------------------------------
Tc-99m 2018/01/01 0.3 (All Tc-99m is 0.3)
I-131 2018/02/01 1 (Activity <=400)
I-131 2018/01/01 0.5 (Activity >400)
I-123 2018/01/01 0.6 (Product is MIBG)
I-123 2018/01/03 0.3 (Not MIBG, <150)
с этим фактором, используемым как MBq * (SELECT TOP 1...) AS Waste
в реальном коде.Итак ... это работает отлично;и я могу суммировать по данным ежегодно с нормальными SUM(Waste)
, GROUP BY Nuclide
и WHERE Year(Given)=[Enter Year]
.Мои проблемы начинаются, когда я пытаюсь использовать это в следующем запросе кросс-таблицы:
PARAMETERS [Enter Year] Short;
TRANSFORM SUM(T.MBq *
(SELECT TOP 1
Factor
FROM WasteFactors
WHERE T.Nuclide = WasteFactors.Nuclide
AND T.Product LIKE WasteFactors.Product
AND (WasteFactors.MinActivity IS NULL
OR WasteFactors.MinActivity >T.MBq)
AND (WasteFactors.MaxActivity IS NULL
OR WasteFactors.MaxActivity <= T.MBq)
ORDER BY WasteFactors.Nuclide ASC, WasteFactors.Product DESC)
)
SELECT T.Nuclide
FROM [RMP Administrations] AS T
WHERE Year(T.[Date Given])=[Enter Year]
GROUP BY T.Nuclide
PIVOT Format(T.[Date Given],"mm - mmm");
с сообщением об ошибке «Access не распознает T.Nuclide как допустимое поле или ....».Я не вижу ошибки в своем SQL и не вижу, почему она не должна работать так, как написано. Я попытался создать функцию VBA для вычисления количества отходов SUM(GetWaste(Nuclide, Product,MBq))
, с функцией, выполняющей тот же SQL, что и выше воднако набор записей делает мой запрос слишком сложным, чтобы его можно было оценить.
Есть ли у кого-нибудь какие-либо идеи о том, где я ошибся с моим кросс-таблицей, как я могу реструктурировать свои WasteFactors, чтобы упростить запрос илиэто слишком сложно, чтобы попытаться сделать это в SQL, и я должен просто сделать это в VBA вместо этого?
Реальный набор данных составляет ~ 1000 записей, охватывающих несколько месяцев, я хотел бы изменить имена таблиц и столбцов начто-то не дерьмо, но я не создал базу данных.Ожидаемый результат для вышеуказанных данных будет:
Nuclide 01 - Jan 02 - Feb
-------------------------------
Tc-99m 210
I-131 277.5 399
I-123 117.3