Как l oop concat в SQL? - PullRequest
       10

Как l oop concat в SQL?

3 голосов
/ 04 августа 2020

Я новичок в sql и застрял с проблемой, где я даже не знал, с чего начать ее решение. Вот почему я здесь.

Вот как выглядит моя установка (я немного упростил ее):

Столбцы Calculation таблицы:

  • Article_ID
  • Версия
  • Комментарий

Столбцы временной таблицы #needs_comment:

  • Article_ID
  • Calculation_Version
  • Material_Number
  • Material_Price_Old
  • Material_Price_New

Пример содержимого для #needs_comment:

+------------+---------------------+-----------------+--------------------+----------------------+
| Article_ID | Calculation_Version | Material_Number | Material_Price_Old | Material_Price_New   |
+------------+---------------------+-----------------+--------------------+----------------------+
|          1 |                   4 | Mat400          |                 20 |                   30 |
|          1 |                   4 | Mat500          |                 50 |                   60 |
|          2 |                   3 | Mat200          |                 30 |                   40 |
+------------+---------------------+-----------------+--------------------+----------------------+

My UPDATE утверждение:

UPDATE Calculation AS c
SET c.Comment = CONCAT('Fabric «', nc.Material_Number, '» price change from ', nc.Material_Price_Old, ' to ', nc.Material_Price_New, '.')

FROM Calculation
JOIN #needs_comment AS nc ON nc.Article_ID = c.Article_ID AND nc.Calculation_Version = c.Version

Я хочу автоматически вставлять комментарий в таблицу расчета, если изменилась цена одного или нескольких материалов, используемых в расчетах c. Поэтому я уже создал все временные таблицы, которые мне нужны для получения правильных данных (ie. Старая цена материала, новая цена материала, когда последний раз обновлялся расчет и т. Д.).

My Update statement сам работает. Он обновляет комментарий поля в таблице расчета с соответствующей информацией. Но это работает только в том случае, если изменилась цена только на один материал. Если существует несколько материалов с разной ценой для одного и того же расчета, он вставляет только один комментарий для одного из изменений. Но я хочу, чтобы он вставлял комментарий для каждого измененного материала. К сожалению, я не понимаю, как я могу oop комментарий для каждого из изменений.

Вот как выглядит таблица вычислений после выполнения оператора обновления:

+------------+---------+---------------------------------------------+
| Article_ID | Version |                   Comment                   |
+------------+---------+---------------------------------------------+
|          1 |       4 | Fabric «Mat400» price change from 20 to 30. |
|          2 |       3 | Fabric «Mat200» price change from 30 to 40. |
+------------+---------+---------------------------------------------+

Вот так я бы хотел, чтобы он выглядел:

+------------+---------+-----------------------------------------------------------------------------------------+
| Article_ID | Version |                                         Comment                                         |
+------------+---------+-----------------------------------------------------------------------------------------+
|          1 |       4 | Fabric «Mat400» price change from 20 to 30. Fabric «Mat500» price change from 50 to 60. |
|          2 |       3 | Fabric «Mat200» price change from 30 to 40.                                             |
+------------+---------+-----------------------------------------------------------------------------------------+

Большое спасибо за каждый совет!

1 Ответ

3 голосов
/ 04 августа 2020

Вот способ сделать это на сервере sql, который выглядит как база данных, которую вы используете (хотя и не уверен на 100%).

Использование функции string_agg, которая доступна во всех последних версиях sql сервер, я объединяю несколько цен и материалов в один столбец с именем comment_concat.

Затем я использую обновление следующим образом, которое обновляет столбец комментариев таблицы расчетов с помощью comment_concat.

update calculation 
   set comment= nc.comment_concat
  from calculation c 
  join (select article_id
             ,calculation_version
             ,string_agg(concat('Fabric ',material_number,' price change from ',material_price_old,' to ',material_price_new),'.') as comment_concat
        from needs_comment
       group by article_id
                ,calculation_version 
      ) nc
    on c.article_id=nc.article_id
   and c.version=nc.calculation_version


+------------+---------+-----------------------------------------------------------------------------------+
| article_id | version |                                      comment                                      |
+------------+---------+-----------------------------------------------------------------------------------+
|          1 |       4 | Fabric Mat400 price change from 20 to 30.Fabric Mat500 price change from 50 to 60 |
|          2 |       3 | Fabric Mat200 price change from 30 to 40                                          |
+------------+---------+-----------------------------------------------------------------------------------+

ссылка на скрипт db с рабочим примером

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=e05d1e4de26da1d186de4e3d381d86ec

...