Мова SQL. Оператори створення та видалення об’єктів баз даних. Оператори пошуку інформації. Агрегатні функції. Вкладені запити, страница 10

Якщо не задано ж одного елемента матриці, то маємо систему  m+n рівнянь (умови балансу) з m змінними. Можна показати, що така  система рівнянь має багато рішень, і вони можуть бути знайдені, у загальному випадку, методом перебору, алгоритм якого залежить від умов конкретної задачі. Якщо для такої неповної системи лінійних рівнянь сформульована цільова функція (максимум прибутку, мінімум витрат на перевезення і т.п.), то така задача зводиться до моделі лінійного програмування, при цьому рівняння балансу будуть обмеженнями. Такі задачі розв’язується відповідними програмами. Але в реальній практиці економічних розрахунків дуже часто зустрічаються випадки, коли оптимізаційна задача не ставиться, тоді їх зручно розв’язувати за допомогою електронних таблиць у діалоговому режимі, тому що користувач  відчуває умови своєї задачі і  може досить швидко   її розв’язати. У таблиці 5а  приведено одне з рішень, яке отримано в Exel. Курсивом показані нові значення, що отримані в результаті “балансування”.

Таблиця 5аРезультат закріплення постачальників за споживачами

Постачальники

Споживачі

С1

С2

С3

Разом

Потужності Пij

50

60

30

140

П1

40

10

20

10

40

П2

30

15

15

30

П3

50

30

20

50

П4

20

10

5

5

20

Всього

140

50

60

30

140

Тепер цю таблицю можна звести до структури, яку можна імпортувати в із середовища Excell в таблицю бази даних Access, яка за своєю структурою є перехресною таблицею. Хай ця таблиця має назву П_С_Cross, її структура і вміст наведено в табл.  5b.

Таблиця 5bСтруктура і вміст таблиці П_С_Cross

NP

С1

С2

С3

П1

10

20

10

П2

0

15

15

П3

30

20

П4

10

5

5

Цю таблицю можна отриманти із таблиці (бази даних) П_С,  структура і вміст якої наведено в табл.6, шляхом засосування запиту типу  CrossTab  до таблиці П_С_Cross.

Таблиця 6. Таблиця БД    „П_С” після розподілення

NP

NC

QTY

П3

C1

30

П1

C1

10

П3

С2

20

П1

С2

20

П4

C1

10

П1

C3

10

П4

С2

5

П2

C2

15

П4

C3

5

П2

C3

15

 Але зараз стоїть зворотна задача – із таблиці П_С_Cross отримати таблицю П_С.  Будемо називати перетворення нормалізованих таблиць типу, що наведено в таблиці 5b (П_С_Cross), в таблиці типу,  що наведен в таблиці 6 (П_С), згорткою, а зворотні перетворення – розгорткою. В сучасних СКБД поки що на верхньому рівні програмування (засобами  візуального програмування і мови SQL СКБД Access) реалізована тільки процедура розгортки, яка здійснюється груповим запитом Crosstabабо інструкцією Transform, але процедура згортки не реалізована безпосередньо груповим оператором,  тому її треба програмувати. Нижче наводиться текст програми (запиту) мовою SQL.

Select П_С_Cross.NP, "С1" As NC, П_С_Cross.[С1] As QTY

From П_С_Cross

Where (((П_С_Cross.[С1]) Is Not Null))

Union

Select П_С_Cross.NP, "С2" As NC, П_С_Cross.[С2] As QTY

From П_С_Cross

Where (((П_С_Cross.[С2]) Is Not Null))

Union

Select П_С_Cross.NP, "С3" As NC, П_С_Cross.[С3] As QTY

From П_С_Cross

Where (((П_С_Cross.[С3]) Is Not Null));