piątek, 8 kwietnia 2011

management studio draw

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 #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.

8 komentarzy:

  1. 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ń
  2. nie wiem o czym mówisz ;)

    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

    OdpowiedzUsuń
  3. Sprawdź sam :-)

    SELECT LEN(REPLICATE(NCHAR(9608), 100. * 87))

    Wynik: 4000, oczekiwany wynik: 8700 ;-)

    OdpowiedzUsuń
  4. Akurat tu się udało i wartości nie przekraczały 4000, bo dzieliłeś jeszcze przez t.razem ;-)

    OdpowiedzUsuń
  5. i nie przekroczy bo to są procenty i nie będzie więcej niż 100

    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

    OdpowiedzUsuń
  6. Fajna zabawa, tak czy siak. A jak do tego rysowania dołożyć spatials, to można zacząć organizować wernisaże ;-)

    PS. Ta zabawa z grafami nie przy każdej czcionce ustawionej dla grida wychodzi tak efektownie :-)

    OdpowiedzUsuń
  7. to ja lepszy pomysł tabela z polami A-H i ośmioma rekordami, są znaki odpowiadające figurą szachowym
    Nic tylko pisać kod ;)

    OdpowiedzUsuń
  8. 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ń