Проблема здесь в том, что тот, кто спроектировал InfoTable
, не соблюдает правила правильной нормализации таблицы , а встраивание строк типа 1129,1134
, указывающих отношения между ключами в других строках, делает жизнь очень трудной.
Если вы используете современную версию SQL Server - 2016 или более позднюю - ваш бекон сохраняется с помощью функции STRING_SPLIT .
Это позволит вам повторнонормализовать таблицу (то есть разделить строки для каждого AVNR
в AVNRString
).Затем вы можете привести раскол AVNR
обратно к INT
, чтобы присоединиться к нему и применить его в группировке, то есть
WITH normalizeInfoTable AS
(
SELECT it.Substation, it.ColumnTitle, it.S6_name, CAST(cs.Value as INT) as AVNR
FROM InfoTable it
CROSS APPLY STRING_SPLIT (it.AVNRString, ',') cs
)
SELECT it.Substation, it.ColumnTitle, it.S6_name, dt.Pdate, dt.pTime, SUM(dt.Wert)
FROM normalizeInfoTable it
INNER JOIN DataTable dt
ON it.AVNR = dt.AVNR
GROUP BY it.Substation, it.ColumnTitle, it.S6_name, dt.Pdate, dt.pTime;
SqlFiddle здесь
Примечания
В вашей таблице продублированы «пары» Info, т.е. эффект
AVNR Substation ColumnTitle S6_name AVNRString
1129 AHWAZ-1 T3+T4 MW 1129,1134
1134 AHWAZ-1 T3+T4 MW 1129,1134
создает 4 строки, так как каждый из 1129 и 1134 будетдублируется дважды каждый.Если это не то, что нужно, то вы можете устранить дубликаты, добавив DISTINCT
в CTE, то есть
SELECT DISTINCT it.Substation, it.ColumnTitle, it.S6_name, CAST(cs.Value as INT) as AVNR
...
Также обратите внимание, что правильная нормализация все еще предпочтительна, так как отношения AVNR
могут бытьобеспечивается внешними ключами, а производительность повышается с помощью индекса для этого столбца.Применение функции STRING_SPLIT
снижает производительность.