SQL-код для присоединения и суммирования данных в таблице, на которую ссылаются ключи, разделенные запятыми - PullRequest
0 голосов
/ 30 мая 2018

У меня есть две таблицы, подобные этой:

InfoTable
-------------------
AVNR    Substation       ColumnTitle     S6_name      AVNRString
-------------------------------------------------------------------
1129     AHWAZ-1        T3+T4              MW          1129,1134
1130     AHWAZ-1        T3+T4              MX          1130,1135
1134     AHWAZ-1        T3+T4              MW          1129,1134
1135     AHWAZ-1        T3+T4              MX          1130,1135
8906     SHOMAL         T9                 MW             8906
8907     SHOMAL         T9                 MX             8907

и

DataTable
------------------------------------------------
Pdate           Ptime     AVNR        Wert
------------------------------------------------
03-13-2017      01:00     1129         12.65
03-13-2017      02:00     1129         25.65
03-13-2017      03:00     1129         102.05
03-12-2017      01:00     1129         12.65
03-14-2017      01:00     1129         12.65
03-16-2017      05:00     1129         12.65    
03-13-2017      01:00     1134         12.65
03-13-2017      02:00     1134         25.65
03-13-2017      03:00     1130         102.05
03-12-2017      01:00     1135         11.15
03-14-2017      01:00     1130         10.00
03-16-2017      01:00     8906         24.5
03-13-2017      01:00     8906         23.5
03-16-2017      02:00     8907         22.5
03-13-2017      01:00     8907         21.5
03-16-2017      05:00     8906         12.5
03-13-2017      02:00     8907         20.5

Я хочу получить этот результат

 ResultTable
-------------------
Substation    ColumnTitle     S6_name   Pdate       pTime   Sum_of_Wert     
-------------------------------------------------------------------
 AHWAZ-1        T3+T4          MW      03-13-2017    01:00   25.3  (sum of Wert for 1129,1134  for that date and time)
 AHWAZ-1        T3+T4          MW      03-13-2017    02:00   51.3  (sum of Wert for 1129,1134  for that date and time)
 AHWAZ-1        T3+T4          MW      03-13-2017    03:00    xxx
 AHWAZ-1        T3+T4          MX      03-14-2017    01:00    xxx
 SHOMAL         T9             MW      03-13-2017    01:00    xxx
 SHOMAL         T9             MW      03-13-2017    02:00    xxx

......

т.е. я хочу получить значение суммы для Substations, которое различается в AvrString для каждой даты и времени.

Есть ли шанс, что я мог бы сделать это в SQL?Я нет, может быть, в Linq?Я программировал в визуальной студии, но это медленно.Я хочу знать, есть ли идея для этого.

Я программирую на C # в Visual Studio с базой данных SQL

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

@ StuartLC - отличный ответ

вот вам еще один способ "использовать distinct и like":

with CTE AS (
  select distinct [Substation], [ColumnTitle],[S6_name], [AVNRString]
  from InfoTable T1
)
select T2.Substation,T2.ColumnTitle, T2.S6_name,T1.Pdate,T1.pTime,sum(T1.Wert) Sum_of_Wert
from DataTable T1
left join InfoTable T2 on  
  T2.AVNRString = T1.AVNR
  or T2.AVNRString like '%,'+T1.AVNR+'%'
  or T2.AVNRString like '%'+T1.AVNR+',%'
group by T2.Substation,T2.ColumnTitle, T2.S6_name,T1.Pdate,T1.pTime
order by Sum_of_Wert

SQL Fiddle DEMO LINK


пс: спасибо @ dotnetstep

По моему мнению, это не очень хороший вариант, если он не имеет явного разделителя.В вашем случае, если таблица T1 имеет значение 1129 (AVNR), а AVNRString содержит 1129,1134, а некоторая другая строка содержит 11290,1134, то она также будет удовлетворять условию.

Я пытаюсь выполнить этот сценарий условия, чтобы избежать его.

   T2.AVNRString = T1.AVNR
      or T2.AVNRString like '%,'+T1.AVNR+'%'
      or T2.AVNRString like '%'+T1.AVNR+',%'
0 голосов
/ 01 июня 2018

здесь запрос с STRING_SPLIT

SELECT it.Substation,it.ColumnTitle,it.S6_name,dt.Pdate,dt.pTime, SUM(dt.Wert) AS Sum_of_Wert
FROM InfoTable it
CROSS APPLY (SELECT value FROM STRING_SPLIT(it.AVNRString, ',') ) x
CROSS APPLY (SELECT * FROM DataTable  WHERE AVNR = CAST(x.value as INT) ) dt
GROUP BY it.Substation,it.ColumnTitle,it.S6_name,dt.Pdate,dt.pTime

ссылка SQL Fiffle http://sqlfiddle.com/#!18/e1ed2d/1

0 голосов
/ 30 мая 2018

Проблема здесь в том, что тот, кто спроектировал 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 снижает производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...