Wyświetlanie wyników w Microsoft SQL Server Management Studio jest nastawione na wydajność nie ma w nim możliwości zabawy z kolorami (pomijając błędy J) czy zróżnicowaniem czcionek i tak powinno być.
Od graficznego przedstawiania wyników są inne narzędzia, chociażby Reporting Services.
Ale jak ktoś się uprze to można się pobawić w SSMS.
CREATE TABLE #ranking (dzien VARCHAR(100), wynik INT)
INSERT #ranking
VALUES ('Poniedziałek',87),('Wtorek',57),('Środa',30),('Czwartek',28),('Piątek',38),('Sobota',11),('Niedziela',0)
GO
Robimy sobie ranking
SELECT
Row_Number() OVER (ORDER BY wynik desc) AS miejsce,
r.dzien,r.wynik
FROM #ranking r
ORDER BY wynik DESC
Jest, no ale jakiś taki nie przemawiający do wyobraźni, no to go trochę zmodyfikujmy
SELECT
NCHAR(9311+Row_Number() OVER (ORDER BY wynik desc)) AS miejsce,
r.dzien,r.wynik,
REPLICATE(NCHAR(9608), 100. * r.wynik / t.razem) AS graf
FROM #ranking r,
(SELECT SUM(wynik) razem FROM #ranking) t
ORDER BY wynik DESC
Prawda, że ładniej
(update : do komentarza Pawła Potasińskiego)
(update : do komentarza Pawła Potasińskiego)
UPDATE #ranking
SET wynik =157
WHERE dzien ='Poniedziałek'
GO
SELECT
NCHAR(9311+Row_Number() OVER (ORDER BY wynik desc)) AS miejsce,
r.dzien,r.wynik,
REPLICATE(NCHAR(9608), 100. * r.wynik / t.razem) AS graf,
100. * r.wynik / t.razem AS [100. * r.wynik / t.razem]
FROM #ranking r,
(SELECT SUM(wynik) razem FROM #ranking) t
ORDER BY wynik DESC
Można też inaczej
SELECT
NCHAR(10101+Row_Number() OVER (ORDER BY wynik desc)) AS miejsce,
r.dzien,r.wynik,
REPLICATE(NCHAR(
CASE WHEN 100. * r.wynik/t.razem = 0 THEN 0
WHEN 100. * r.wynik/t.razem > 0 AND 100. * r.wynik/t.razem < 10 THEN 9617
WHEN 100. * r.wynik/t.razem > 10 AND 100. * r.wynik/t.razem < 20 THEN 9618
WHEN 100. * r.wynik/t.razem > 20 AND 100. * r.wynik/t.razem < 30 THEN 9619
WHEN 100. * r.wynik/t.razem > 30 THEN 9608 END ), 20) AS graf
FROM #ranking r,
(SELECT SUM(wynik) razem FROM #ranking) t
ORDER BY wynik DESC
Tabelka z kontaktami
CREATE TABLE #osoby (nazwisko VARCHAR(100),imie VARCHAR(100),plec char(1), kontakt VARCHAR(500),aktywny BIT)
INSERT #osoby
VALUES ('Kowalski','Jan','M','+48 22 123-45-78',1),
('Malinowski','Stefan','M','mstefan@serwer.pl',1),
('Nowak','Zofia','F','+48 600-123-234',1),
('Kowalik','Barbara','F','bkowal@host.com',0)
Wyświetlamy wynik
SELECT * FROM #osoby
Nudno, bez wyrazu trochę zmienimy
SELECT nazwisko,imie,
[płeć]=CASE plec WHEN 'F'THEN NCHAR(9792) WHEN 'M'THEN NCHAR(9794) ELSE ''END,
kontakt =CASE WHEN kontakt LIKE '+%'THEN NCHAR(9742)+kontakt WHEN kontakt LIKE '%@%.%'THEN NCHAR(9993)+kontakt END,
aktywny= CASE aktywny WHEN 1 THEN NCHAR(9745) ELSE NCHAR(9744) END
FROM #osoby
Podoba się ?
Oczywiście trzeba takie „malowanie „ traktować w kategorii zabawy i nie stosować tego w zapytaniach, unikać zbędnych kosztów w planach. Od takich fantazji są inne narzędzia.
BTW, sprawdziłeś długość paska w grafie, gdy wartość jest większa niż 40? ;-) REPLICATE ma parszywą cechę - jak nie zrzutujesz pierwszego parametru na typ varchar(max)/nvarchar(max), umie zwrócić maksymalnie 4000 znaków dla nvarchar/nchar i 8000 dla varchar/char.
OdpowiedzUsuńnie wiem o czym mówisz ;)
OdpowiedzUsuńzmiana kodu
UPDATE #ranking
SET wynik =157
WHERE dzien ='Poniedziałek'
GO
SELECT
NCHAR(9311+Row_Number() OVER (ORDER BY wynik desc)) AS miejsce,
r.dzien,r.wynik,
REPLICATE(NCHAR(9608), 100. * r.wynik / t.razem) AS graf,
100. * r.wynik / t.razem AS [100. * r.wynik / t.razem]
FROM #ranking r,
(SELECT SUM(wynik) razem FROM #ranking) t
ORDER BY wynik DESC
wynik w update treści
Sprawdź sam :-)
OdpowiedzUsuńSELECT LEN(REPLICATE(NCHAR(9608), 100. * 87))
Wynik: 4000, oczekiwany wynik: 8700 ;-)
Akurat tu się udało i wartości nie przekraczały 4000, bo dzieliłeś jeszcze przez t.razem ;-)
OdpowiedzUsuńi nie przekroczy bo to są procenty i nie będzie więcej niż 100
OdpowiedzUsuńprzy kresce która by była z 4000 znaków i tak by się nikt nie zorientował bo grid tyle nie wyświetli w standardzie
Fajna zabawa, tak czy siak. A jak do tego rysowania dołożyć spatials, to można zacząć organizować wernisaże ;-)
OdpowiedzUsuńPS. Ta zabawa z grafami nie przy każdej czcionce ustawionej dla grida wychodzi tak efektownie :-)
to ja lepszy pomysł tabela z polami A-H i ośmioma rekordami, są znaki odpowiadające figurą szachowym
OdpowiedzUsuńNic tylko pisać kod ;)
Dobre :-) A te grafy to może by się i dało wykorzystać jakoś, np. do reprezentowania czasów trwania jobów (do kontroli, które idą w tym samym czasie) :-D
OdpowiedzUsuń