Wolne krzesła na sali kinowej, szukamy selectami...




Problem  jest jak na obrazku, jest sala kinowa, niektóre miejsca są już sprzedane, przychodzi 6  osób i jak szybko namierzyć najlepsządla nich lokalizację, by wszyscy siedzieli obok siebie.



Człowiek to sobie patrzy, oczyma zlokalizuje, policzy, wie… (jakaś większość na pewno sobie z tym radzi). A aplikacja czy też strona internetowa tak jak my ludzie to tego nie zrobi.  

Aplikacja jest najprawdopodobniej spięta z jakimś systemem zarządzania bazą (np. MySQL) i musi  mieć algorytm. My sobie klik a tam kwerendy się wykonują między innymi. 

I przygotowałem rozwiązanie, selecty, widoki etc. Tak by tylko wystarczyło podać ile miejsce jest potrzebnych i wyświetla się lista propozycji od najwyższego. 

Prezentacja, kwerenda, opis dostępny tu:
 


W przykładzie już są jakieś zajęte miejsca, to dla celu prezentacji rozwiązania, ale przecież masz dostęp do bazy, to jak sprzedamy np. miejsce nr 5 w rzędzie B, to my klik, a tam uruchamiają się kwerendy:

update

sala_kinowa

set status='X'

where rzad='B' and miejsce=5;



update

sala_kinowa

set status_opis='SOLD'

where rzad='B' and miejsce=5;

I już będzie nowy zestaw luk.
 select * from v_luki;









 

Klauzula WITH oraz UNION ALL pozwala na uzyskanie pętli.



Wybrać coś z czegoś czy z czegoś coś. Takie rozważania swego czasu opisałem.
Klauzula WITH oraz UNION ALL pozwala na uzyskanie pętli.
Taką pętle wykorzystałem do rozkładania ciągu znaków podzielonego średnikami na osobne kolumny. To sprawa opisana tu:
Ale najprościej to można podejrzeć, poćwiczyć na wyprodukowaniu sobie kalendarza.
Obrazek, kwerenda i drobny opis jest tutaj.


KWERENDA:


WITH kalendarz (numer, data)

AS ( SELECT 1, convert(date, '2012-01-01')
     UNION ALL 
     SELECT numer+1, dateadd(day, 1, data)
     FROM kalendarz WHERE data<'2012-01-31'
     )

SELECT *  FROM kalendarz

OPTION    (maxrecursion 400) ; 


-- to jest potrzebne, gdy dni chcemy dużo więcej uzupełnić niż 100,
-- bo domyślnie jest ograniczenie
-- do rekurencji 100



CVS (ciąg znaków podzielony separatorem) wciśnięty w jedną kolumnę rozkładam na kolumny na MS SQL Serwerze



Działamy na MS SQL Serwerze. Jedna kolumna, a w niej ciąg znaków,  wartości rozdzielone średnikami. Ewidentnie CVS wrzucony do tabeli i tyle, ale w jedną kolumnę. I jak to rozłożyć do osobnych kolumn. Można wyeksportować do pliku, otworzyć  przy pomocy EXCEL, zapisać już jako plik  w formacie EXCEL i importować na Server. Jak bez EXCELA to zrobić. Chcesz się dowiedzieć jak ja to zrobiłem?
Na MS SQL Serverze nie ma tak jak na ORACLE funkcji INSTR, która pozwala namierzyć zadane/konkretne wystąpienie znaku i następie ciąć przy pomocy SUBSTRING.
Co wykorzystałem:
ROW_NUMBER () over ( order by …)
CHARINDEX (.... , …. , …)
SUBSTRING
RTRIM
I klauzule WITH i możliwość uzyskania przy jej pomocy rekurencji.
Oczywiście jeszcze jakiś WIDOK, zapisywałem dane nie na ekran ale przy pomocy klauzuli INTO do tabelki, robiłem złączenia, podzapytania… Prezentacja w całości pokazująca rozwiązanie, kod SQL to wszystko jest dostępne do przeczytania i do poćwiczenia. 

https://drive.google.com/drive/folders/0B0DNBH1DOPAfbVdZckUyRF9TekU?usp=sharing