Таким образом, ваш запрос в основном сводится к (я думаю):
SELECT
p1.AR1ID AS Article,
p1.DAT AS Lot,
ROUND((SUM(p1.VAL))/(COUNT(p1.VAL)),2) AS [Weight],
ROUND((SUM(p2.VAL))/(COUNT(p2.VAL)),2) AS [Width],
ROUND((SUM(p3.VAL))/(COUNT(p3.VAL)),2) AS [Length],
ROUND((SUM(p4.VAL))/(COUNT(p4.VAL)),2) AS [Thickness]
FROM
PesoMedioLotto p1
INNER JOIN PesoMedioLotto p2 ON p2.AR1ID = p1.AR1ID AND p2.DAT = p1.DAT AND p2.DES1 = 'Width'
INNER JOIN PesoMedioLotto p3 ON p3.AR1ID = p1.AR1ID AND p3.DAT = p1.DAT AND p3.DES1 = 'Length'
INNER JOIN PesoMedioLotto p4 ON p4.AR1ID = p1.AR1ID AND p4.DAT = p1.DAT AND p4.DES1 = 'Thickness'
WHERE
p1.DES1 = 'Weight'
GROUP BY
p1.AR1ID,
p1.DAT;
Мне было бы интересно посмотреть, что произойдет, когда вы запустите это:
SELECT DISTINCT
p1.AR1ID AS Article,
p1.DAT AS Lot
FROM
PesoMedioLotto p1
INNER JOIN PesoMedioLotto p2 ON p2.AR1ID = p1.AR1ID AND p2.DAT = p1.DAT AND p2.DES1 = 'Width'
INNER JOIN PesoMedioLotto p3 ON p3.AR1ID = p1.AR1ID AND p3.DAT = p1.DAT AND p3.DES1 = 'Length'
INNER JOIN PesoMedioLotto p4 ON p4.AR1ID = p1.AR1ID AND p4.DAT = p1.DAT AND p4.DES1 = 'Thickness'
WHERE
p1.DES1 = 'Weight';
Если это не такне запускайте, не могли бы вы закомментировать JOIN
в p4, затем JOIN
в p3 и т. д. Или вы можете попробовать удалить DISTINCT
, чтобы посмотреть, получите ли вы частичный набор результатов, даже если запрос никогда не завершитсясвоевременно.
Я предполагаю, что у вас в базе данных гораздо больше данных о длине и / или толщине, чем о весах или ширинах?
Это также может быть полезно длязнать:
SELECT DES1, COUNT(*) AS freq FROM PesoMedioLotto GROUP BY DES1;
Тогда мои следующие вопросы будут:
- Почему все эти данные находятся в одной таблице, когда может иметь смысл иметь разные таблицы для разных метрик?
- содержит ли данные строки для других значений DES1, и если да, то сколько?
- есть ли сироты, например, толщина для AR1ID / DAT, который также не имеет веса?
- у вас есть хорошие индексы для этой таблицы?
Если таблица настроена так, что запрос невозможен, тогда лучшим вариантом может быть выполнение запроса по частям:
- загружать только те данные, которые вам нужныво временную таблицу;
- применить индексы к временной таблице;
- выполнить запрос из временной таблицы.
Может быть что-то вроде этого:
SELECT AR1ID, DAT, DES1, VAL INTO #temp FROM PesoMedioLotto WHERE DES1 IN ('Weight', 'Width', 'Length', 'Thickness');
CREATE INDEX ix$lotto1 ON #temp (DES1);
CREATE INDEX ix$lotto2 ON #temp (AR1ID, DAT);
SELECT
p1.AR1ID AS Article,
p1.DAT AS Lot,
ROUND((SUM(p1.VAL))/(COUNT(p1.VAL)),2) AS [Weight],
ROUND((SUM(p2.VAL))/(COUNT(p2.VAL)),2) AS [Width],
ROUND((SUM(p3.VAL))/(COUNT(p3.VAL)),2) AS [Length],
ROUND((SUM(p4.VAL))/(COUNT(p4.VAL)),2) AS [Thickness]
FROM
#temp p1
INNER JOIN #temp p2 ON p2.AR1ID = p1.AR1ID AND p2.DAT = p1.DAT AND p2.DES1 = 'Width'
INNER JOIN #temp p3 ON p3.AR1ID = p1.AR1ID AND p3.DAT = p1.DAT AND p3.DES1 = 'Length'
INNER JOIN #temp p4 ON p4.AR1ID = p1.AR1ID AND p4.DAT = p1.DAT AND p4.DES1 = 'Thickness'
WHERE
p1.DES1 = 'Weight'
GROUP BY
p1.AR1ID,
p1.DAT;