maggio 2007 - Posts

[SQL] Tabella "visite" e recuperare tragitto fatto - Ovvero: fare distinct su località visitate di seguito
31 maggio 07 01.17 | abenedetti | 2 comment(s)

Ok, il titolo è un pò strano, ma non sapevo come metterlo meglio ;-)

Ieri un cliente mi ha prospettato una domanda interessante...
Supponiamo di avere una tabella [spostamenti] dove l'utente memorizza i clienti che visita, quindi la data (quando) e la citta (dove).

Supponiamo quindi che io, oggi, memorizzi visite come:
cliente A - mattina - brescia
cliente B - mattina - brescia
cliente C - pomeriggio - milano
cliente D - sera - brescia
...

La domanda è: come faccio a visualizzare le città visitate in modo tale che se faccio più incontri nello stesso luogo la città mi appaia una volta sola?
Ovvero: non mi interessa quanti clienti ho visitato nella città "A", quanto avere sotto mano il percorso (tragitto) fatto...

Interessante... mi sono divertito.
Ecco come risolverei:

USE tempdb
GO

create table spostamenti
(
idRecord int primary key identity(1,1),
data datetime,
citta varchar(30)
)
go

insert spostamenti values ('20070531 9:00:00','brescia')
insert spostamenti values ('20070531 10:00:00','brescia')
insert spostamenti values ('20070531 10:30:00','brescia')
insert spostamenti values ('20070531 12:00:00','milano')
insert spostamenti values ('20070531 14:00:00','brescia')
insert spostamenti values ('20070531 14:10:00','desenzano')
insert spostamenti values ('20070531 14:30:00','brescia')
insert spostamenti values ('20070531 15:00:00','brescia')
insert spostamenti values ('20070531 16:00:00','brescia')
insert spostamenti values ('20070531 17:00:00','verona')
insert spostamenti values ('20070531 19:00:00','brescia')

-- Questa la mia tabella di spostamenti
select from spostamenti order by data

/*
Risultato:

idRecord    data                    citta
----------- ----------------------- ------------------------------
1           2007-05-31 09:00:00.000 brescia
2           2007-05-31 10:00:00.000 brescia
3           2007-05-31 10:30:00.000 brescia
4           2007-05-31 12:00:00.000 milano
5           2007-05-31 14:00:00.000 brescia
6           2007-05-31 14:10:00.000 desenzano
7           2007-05-31 14:30:00.000 brescia
8           2007-05-31 15:00:00.000 brescia
9           2007-05-31 16:00:00.000 brescia
10          2007-05-31 17:00:00.000 verona
11          2007-05-31 19:00:00.000 brescia

(11 row(s) affected)
*/

-- Questa la tabella con un check per verificare se sono stato più volte o meno
select * , (select count(1from spostamenti S2 where S2.citta S1.citta and S2.idRecord S1.idRecord+1as from spostamenti S1

/*
Risultato:

idRecord    data                    citta                          N
----------- ----------------------- ------------------------------ -----------
1           2007-05-31 09:00:00.000 brescia                        1
2           2007-05-31 10:00:00.000 brescia                        1
3           2007-05-31 10:30:00.000 brescia                        0
4           2007-05-31 12:00:00.000 milano                         0
5           2007-05-31 14:00:00.000 brescia                        0
6           2007-05-31 14:10:00.000 desenzano                      0
7           2007-05-31 14:30:00.000 brescia                        1
8           2007-05-31 15:00:00.000 brescia                        1
9           2007-05-31 16:00:00.000 brescia                        0
10          2007-05-31 17:00:00.000 verona                         0
11          2007-05-31 19:00:00.000 brescia                        0

(11 row(s) affected)
*/

--  Questo il risultato finale
select citta from
(
         
select * , (select count(1from spostamenti S2 where S2.citta S1.citta and S2.idRecord S1.idRecord+1as from spostamenti S1
T
where 0
order by T.data

drop table spostamenti
go

/*
Risultato:

citta
------------------------------
brescia
milano
brescia
desenzano
brescia
verona
brescia

(7 row(s) affected)
*/

Praticamente con la seconda query siamo in grado di avere le città che hanno la successiva identica con un valore = 1.
In questo modo, filtrando per quel campo = 0, abbiamo solo le città che vogliamo visualizzare.

Diciamo che è un pò il "classico" problema del: "... voglio resettare un contatore al cambio di articolo / fornitore / cliente / ..."

Commenti?

Filed under:
[Reporting] Colorare a righe alternate una matrice
10 maggio 07 05.14 | abenedetti | with no comments

Per colorare a righe alternate un oggetto tabella è sufficiente utilizzare la funzione RowNumber scrivendo, ad esempio:
=iif(RowNumber(nothing) mod 2 = 0, "red", "green")

Nelle matrici la RowNumber non può funzionare... quindi dobbiamo realizzarla "a mano".

Per colorare le righe quindi:

1) ci serve una colonna che, tramite la funzione RunningValue ed il CountDistinct possa farmi contare le righe in maniera univoca e quindi, tramite la classica "... mod 2 = 0 ..." distinguere le righe pari e le righe dispari.

Ad esempio, aggiungo al report una colonna in cui visualizzare (proprietà text):
= iif( RunningValue(Fields!XXXXXX.Value,CountDistinct,Nothing) mod 2 = 0, "#dedede", "#ededed")

Dove XXXXX è il campo che mi da l'univocità di riga.

Se l'univocità di riga la ottengo da più colonne (supponete di fare avere colonne "cognome" e "nome"), il parametro di RunningValue deve essere la concatenazione delle colonne:

= iif( RunningValue( (Fields!cognome.Value & Fields!nome.Value) ,CountDistinct,Nothing) mod 2 = 0,  "red", "green")

2) rendiamo invisibile questa nuova colonna

3) nella riga della matrice impostiamo la proprietà BackgroundColor come:

= ReportItems!YYYYYY.Value

Dove YYYYYY è il nome che abbiamo dato alla nuova cella che abbiamo creato tramite il punto 1

N.B.: se la matrice ha attivi i subtotali e se il background di queste celle è imposato come trasparente, il colore sarà identico a quello dell'ultima riga dati precedente

 

Filed under:
[SQL] Katmai...
10 maggio 07 11.34 | abenedetti | with no comments

Sembra che a Redmond i motori siano parecchio caldi....

Dopo quello che abbiamo visto al summit MVP qualcosa comincia ad uscire.

Qui e qui...

This Blog

Syndication