Доступ к SQL-кросс-таблице Функция SELECT TOP 1 - PullRequest
0 голосов
/ 18 сентября 2018

Я рассчитываю отходы на основе введенного количества, скорректированного с использованием поправочного коэффициента, считанного из таблицы.Ниже приведена структура таблиц с некоторыми примерами данных:

Администрации 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

1 Ответ

0 голосов
/ 18 сентября 2018

Таким образом, вы не можете использовать подзапрос в предложении TRANSFORM afaik.

Используйте подзапрос в предложении FROM, умножив этот подзапрос на MBq.Тогда используйте только простой агрегат в предложении TRANSFORM

Sample, возможно, нуждается в уточнении:

PARAMETERS [Enter Year] Short;
TRANSFORM SUM(TransformField)
SELECT R.Nuclide
FROM (SELECT *, 
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) As TransformField
 FROM [RMP Administrations] T
) AS R
WHERE Year(R.[Date Given])=[Enter Year]
GROUP BY R.Nuclide
PIVOT Format(R.[Date Given],"mm - mmm");
...