Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Query dati raggruppati per ORE del giorno

797 views
Skip to first unread message

emanuele....@gmail.com

unread,
Jul 29, 2005, 3:47:27 AM7/29/05
to
STO IMPAZZENDO !!!!!!!!!!
questa query mi sta facendo diventare pazzo
vi spiego cosa devo fare , ho una tabella (Tabella_DATI) che contiene
una serie di valori rilevati ogni quarto d'ora da dei dispositivi ,
ogni dispositivo ha un proprio Identificativo (IDFLOW) , devo ottenere
una vista che dovrò utilizzare in un report che mi mostri i valori di
ciascun dispositivo in diverse colonne da una data ad un altra data .

I report dovranno essere di vari tipo , giornaliero , mensile ,
settimanale .
di seguito vi riporto la struttura della tabella dei dati e sotto come
dovrebbe essere la mia vista.

Io ho trovato il modo per visualizzare i dati su diverse colonne ,
però quando raggruppo i dati per ora avviene una cosa strana , i
valori della vista sono moltiplicati per 16 , numero che non mi dice
proprio nulla , vi riporto la query con il risultato che ho ottenuto .

TABELLA GENERALE DEI DATI
IDFLOW | DATAORA | VALORE
----------------------------------------
1699 14/03/2005 40.58
1699 14/03/2005 0:15:00 46.74
1699 14/03/2005 0:30:00 53.96
1699 14/03/2005 0:45:00 40.57
1699 14/03/2005 1:00:00 44.68
1699 14/03/2005 1:15:00 44.69
1699 14/03/2005 1:30:00 35.45
1699 14/03/2005 1:45:00 40.59
1699 14/03/2005 2:00:00 49.84
1699 14/03/2005 2:15:00 52.9
1699 14/03/2005 2:30:00 35.45
1699 14/03/2005 2:45:00 49.84
1670 14/03/2005 40.58
1670 14/03/2005 0:15:00 46.74
1670 14/03/2005 0:30:00 53.96
1670 14/03/2005 0:45:00 40.57
1670 14/03/2005 1:00:00 44.68
1670 14/03/2005 1:15:00 44.69
1670 14/03/2005 1:30:00 35.45
1670 14/03/2005 1:45:00 40.59
1670 14/03/2005 2:00:00 49.84
1670 14/03/2005 2:15:00 52.9
1670 14/03/2005 2:30:00 35.45
1670 14/03/2005 2:45:00 49.84

RISULTATO GIUSTO
ANNO | GIORNOANNO | GIORNO | ORA | K000 | K001 | K002 |
----------------------------------------------------------------------
2005 | 73 | 14-03-2005 | 0 | 187.1 | 177.78 | 181.5 |
2005 | 73 | 14-03-2005 | 0 | 178.5 | 147.95 | 182.8 |

RISULTATO ERRATO ( i valori delle colonne K sono esattamente 16 volte
il risultato coretto)
ANNO | GIORNOANNO | GIORNO | ORA | K000 | K001 | K002 |
----------------------------------------------------------------------
2005 | 73 | 14-03-2005 | 0 | 2992.16 | 2844.48 | 2909.6 |
2005 | 73 | 14-03-2005 | 1 | 2856.12 | 2367.23 | 2924.7 |

QUERY
----------------------------------------------

SELECT DISTINCT

{ fn YEAR(Tabella_DATI.DataOra) } AS ANNO,
{ fn DAYOFYEAR(Tabella_DATI.DataOra) } AS GIORNOANNO,
CONVERT(CHAR(10), Tabella_DATI.DataOra, 105) AS GIORNO,
{ fn HOUR(Tabella_DATI.DataOra) } AS ORA,
SUM(FW01700.valore) AS K000,
SUM(FW01701.valore) AS K001,
SUM(FW01699.valore) AS K002

FROM

Tabella_DATI INNER JOIN
Tabella_DATI FW01700 ON FW01700.DataOra = Tabella_DATI.DataOra INNER
JOIN
Tabella_DATI FW01701 ON FW01701.DataOra = Tabella_DATI.DataOra INNER
JOIN
Tabella_DATI FW01699 ON FW01699.DataOra = Tabella_DATI.DataOra

WHERE
(FW01700.IdFlow = 1700)
AND (FW01699.IdFlow = 1699)
AND (Tabella_DATI.DataOra BETWEEN CONVERT(DATETIME, '2004-01-01
00:00:00', 102)
AND CONVERT(DATETIME, '2005-12-31 23:45:00', 102))
AND (FW01701.IdFlow = 1701)


GROUP BY
{ fn YEAR(Tabella_DATI.DataOra) },
{ fn HOUR(Tabella_DATI.DataOra) },
CONVERT(CHAR(10),
Tabella_DATI.DataOra, 105),
{ fn DAYOFYEAR(Tabella_DATI.DataOra)}


ORDER BY

{ fn YEAR(Tabella_DATI.DataOra) },
{ fn DAYOFYEAR(Tabella_DATI.DataOra) },
{ fn HOUR(Tabella_DATI.DataOra) }

Lorenzo Benaglia

unread,
Jul 29, 2005, 3:54:08 AM7/29/05
to
emanuele....@gmail.com wrote:
> STO IMPAZZENDO !!!!!!!!!!

Che DBMS ustilizzi?
Ti ricordo che questo ng è dedicato a Microsoft SQL Server.
Se desideri ricevere supporto per un altro DBMS prova a postare su
it.comp.software.database.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Pasi

unread,
Jul 29, 2005, 3:57:03 AM7/29/05
to
Utilizzo Sql Server 2000

Lorenzo Benaglia

unread,
Jul 29, 2005, 3:59:33 AM7/29/05
to
Pasi wrote:
> Utilizzo Sql Server 2000

SELECT DISTINCT

{ fn YEAR(Tabella_DATI.DataOra) } AS ANNO,
{ fn DAYOFYEAR(Tabella_DATI.DataOra) } AS GIORNOANNO,
CONVERT(CHAR(10), Tabella_DATI.DataOra, 105) AS GIORNO,
{ fn HOUR(Tabella_DATI.DataOra) } AS ORA,
SUM(FW01700.valore) AS K000,
SUM(FW01701.valore) AS K001,
SUM(FW01699.valore) AS K002

fn YEAR()
fn DAYOFYEAR()
fn HOUR()

Cosa sono? Questa sintassi non è T-SQL.

Pasi

unread,
Jul 29, 2005, 4:04:29 AM7/29/05
to
sono funzioni di conversione delle date , le ho trovate qui

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/odbctime__date__and_interval_functions.asp...


riesci ad indicarmene altre magari più efficaci ?

Lorenzo Benaglia

unread,
Jul 29, 2005, 4:08:58 AM7/29/05
to

Il link che mi hai passato non funziona, ma mi sembra di capire che siano
funzioni ODBC.
Il T-SQL offre diverse funzioni datetime che trovi ducumentare sui Books
Online:

"Date and Time Functions"
http://msdn.microsoft.com/library/en-us/tsqlref/ts_fa-fz_2c1f.asp

Pasi

unread,
Jul 29, 2005, 4:17:52 AM7/29/05
to
nel mio caso se voglio estrarre l'ora nel campo DataOra della mia
Tabella_DATI devo scrivere così giusto ?

DATEPART(hour, Tabella_DATI.DataOra)

Pasi

unread,
Jul 29, 2005, 4:22:00 AM7/29/05
to
non è cambiato nulla ... i valori sono sempre sbagliati :-(

Lorenzo Benaglia

unread,
Jul 29, 2005, 4:27:37 AM7/29/05
to
Pasi wrote:
> nel mio caso se voglio estrarre l'ora nel campo DataOra della mia
> Tabella_DATI devo scrivere cosě giusto ?
>
> DATEPART(hour, Tabella_DATI.DataOra)

Questa funzione ti restituisce solo l'ora (HH).
Se intendi recuperare HH:MM:SS puoi ricorrere alla funzione CONVERT per
castare a stringa la colonna datetime specificando lo stile 8 o 108:

SELECT CONVERT(char(8), GETDATE(), 108) Ora
GO

/* Output:

Ora
--------
10:25:54

(1 row(s) affected)

*/

Maggiori informazioni sui Books Online:
http://msdn.microsoft.com/library/en-us/tsqlref/ts_ca-co_2f3o.asp

Comunque il problema non sono le funzioni, ma la query... purtroppo non ho
capito il ragionamento che ci sta dietro...

Pasi

unread,
Jul 29, 2005, 4:34:06 AM7/29/05
to
ho già usato il cast per convertire le date , il punto credo che non
siano come dici le funzioni ma qualche cosa sulla query ... anche
perchè se invece di fare la somma dei valori lascio solo il
raggruppamento ottengo i valori singolarmente ma corretti :-(
c'è nessuno che ha voglia di sbatterci la testa ?
io non ci capisco + nulla è troppo tempo che ci ragiono sopra

Marcello

unread,
Jul 29, 2005, 4:51:53 AM7/29/05
to
Ciao,

Sono le join che moltiplicano i valori per 16...
Prova così:

use tempdb
go
create table tabella (IDFLOW int,DATAORA datetime, VALORE Money)
go
insert into tabella values(1699, '20050314', 40.58)
insert into tabella values(1699, '20050314 0:15:00',46.74)
insert into tabella values(1699, '20050314 0:30:00',53.96)
insert into tabella values(1699, '20050314 0:45:00',40.57)
insert into tabella values(1699, '20050314 1:00:00',44.68)
insert into tabella values(1699, '20050314 1:15:00',44.69)
insert into tabella values(1699, '20050314 1:30:00',35.45)
insert into tabella values(1699, '20050314 1:45:00',40.59)
insert into tabella values(1699, '20050314 2:00:00',49.84)
insert into tabella values(1699, '20050314 2:15:00',52.9)
insert into tabella values(1699, '20050314 2:30:00',35.45)
insert into tabella values(1699, '20050314 2:45:00',49.84)
insert into tabella values(1670, '20050314',0.58)
insert into tabella values(1670, '20050314 0:15:00',46.74)
insert into tabella values(1670, '20050314 0:30:00',53.96)
insert into tabella values(1670, '20050314 0:45:00',40.57)
insert into tabella values(1670, '20050314 1:00:00',44.68)
insert into tabella values(1670, '20050314 1:15:00',44.69)
insert into tabella values(1670, '20050314 1:30:00',35.45)
insert into tabella values(1670, '20050314 1:45:00',40.59)
insert into tabella values(1670, '20050314 2:00:00',49.84)
insert into tabella values(1670, '20050314 2:15:00',52.9)
insert into tabella values(1670, '20050314 2:30:00',35.45)
insert into tabella values(1670, '20050314 2:45:00',49.84)
go
select Anno=year(DataOra),
GiornoAnno=datepart(dy,DataOra),
Giorno=convert(varchar,DataOra,105),
Ora=datepart(hh,DataOra),
K000=sum(case IDFLOW when 1700 then valore else 0 end),
K001=sum(case IDFLOW when 1670 then valore else 0 end),
K002=sum(case IDFLOW when 1699 then valore else 0 end)
from tabella
group by year(DataOra),datepart(dy,DataOra),
convert(varchar,DataOra,105),datepart(hh,DataOra)
go
drop table tabella

marc.

Pasi ha scritto:

Lorenzo Benaglia

unread,
Jul 29, 2005, 4:50:51 AM7/29/05
to
Pasi wrote:
> io non ci capisco + nulla è troppo tempo che ci ragiono sopra

Figurati io!
Un esempio più confuso non potevi farlo.
I dati di input sono incompleti ed incoerenti rispetto al risultato che hai
postato!!!
Non c'è situazione peggiore di questa.

Comunque dopo essermi confrontato con Giorgio Rancati, penso che questo sia
il risultato che vuoi ottenere:

USE tempdb
GO

/* Definisco la tabella dbo.Tabella_DATI */
CREATE TABLE dbo.Tabella_DATI(
IDFLOW int NOT NULL,
DATAORA datetime NOT NULL,
VALORE decimal(4, 2) NOT NULL
)
GO

/* La popolo */
SET NOCOUNT ON
INSERT dbo.Tabella_DATI VALUES(1699, '20050314', 40.58)
INSERT dbo.Tabella_DATI VALUES(1699, '20050314 0:15:00', 46.74)
INSERT dbo.Tabella_DATI VALUES(1699, '20050314 0:30:00', 53.96)
INSERT dbo.Tabella_DATI VALUES(1699, '20050314 0:45:00', 40.57)
INSERT dbo.Tabella_DATI VALUES(1699, '20050314 1:00:00', 44.68)
INSERT dbo.Tabella_DATI VALUES(1699, '20050314 1:15:00', 44.69)
INSERT dbo.Tabella_DATI VALUES(1699, '20050314 1:30:00', 35.45)
INSERT dbo.Tabella_DATI VALUES(1699, '20050314 1:45:00', 40.59)
INSERT dbo.Tabella_DATI VALUES(1699, '20050314 2:00:00', 49.84)
INSERT dbo.Tabella_DATI VALUES(1699, '20050314 2:15:00', 52.9)
INSERT dbo.Tabella_DATI VALUES(1699, '20050314 2:30:00', 35.45)
INSERT dbo.Tabella_DATI VALUES(1699, '20050314 2:45:00', 49.84)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314', 40.58)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314 0:15:00', 88.74)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314 0:30:00', 12.96)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314 0:45:00', 40.57)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314 1:00:00', 6.68)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314 1:15:00', 28.69)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314 1:30:00', 35.45)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314 1:45:00', 55.59)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314 2:00:00', 49.84)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314 2:15:00', 81.9)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314 2:30:00', 35.45)
INSERT dbo.Tabella_DATI VALUES(1670, '20050314 2:45:00', 14.84)
INSERT dbo.Tabella_DATI VALUES(1671, '20050314', 40.58)
INSERT dbo.Tabella_DATI VALUES(1671, '20050314 0:15:00', 46.74)
INSERT dbo.Tabella_DATI VALUES(1671, '20050314 0:30:00', 53.96)
SET NOCOUNT OFF
GO

SELECT
YEAR(DATAORA) ANNO
, DATEPART(dayofyear, DATAORA) GIORNOANNO
, CONVERT(char(10), DATAORA, 105) GIORNO
, DATEPART(hour, DATAORA) ORA
, SUM(CASE IDFLOW
WHEN 1699 THEN VALORE
ELSE 0
END
) K000
, SUM(CASE IDFLOW
WHEN 1670 THEN VALORE
ELSE 0
END
) K001
, SUM(CASE IDFLOW
WHEN 1671 THEN VALORE
ELSE 0
END
) K002

FROM dbo.Tabella_DATI
WHERE IDFLOW IN(1699, 1670, 1671)
GROUP BY
YEAR(DATAORA)
, DATEPART(dy, DATAORA)
, CONVERT(char(10), DATAORA, 105)
, DATEPART(hour, DATAORA)

GO

/* Output:

ANNO GIORNOANNO GIORNO ORA K000 K001 K002
----- ----------- ---------- ---- ------- ------- -------

2005 73 14-03-2005 0 181.85 182.85 141.28
2005 73 14-03-2005 1 165.41 126.41 .00
2005 73 14-03-2005 2 188.03 182.03 .00

(3 row(s) affected)


/* Pulizia */
DROP TABLE dbo.Tabella_DATI

giorgio rancati

unread,
Jul 29, 2005, 4:55:27 AM7/29/05
to
<emanuele....@gmail.com> ha scritto nel messaggio
news:1122623247....@g47g2000cwa.googlegroups.com...
STO IMPAZZENDO !!!!!!!!!!

Ciao,

io credo di aver capito che ti serva questa query
----
Select Year(DATAORA) AS Anno,
DatePart(dy,DataOra) AS GIORNOANNO,
Convert(varchar,Dataora,105) as GIORNO,
Datepart(hh,DataOra) AS Ora,
SUM(CASE WHEN IDFLOW=1700 THEN Valore Else 0 END) AS K000,
SUM(CASE WHEN IDFLOW=1701 THEN Valore Else 0 END) AS K001,
SUM(CASE WHEN IDFLOW=1699 THEN Valore Else 0 END) AS K002
From Tabella_Dati
GROUP BY Year(DATAORA),
DatePart(dy,DataOra),
Convert(varchar,Dataora,105),
Datepart(hh,DataOra)
----

ma se questa č la soluzione che cercavi significa che i dati di esempio che
ci hai mostrato sono tutti sballati :-)
non potresti essere piů preciso ?

Ciao
--
Giorgio Rancati
[Office Access MVP]

Pasi

unread,
Jul 29, 2005, 5:03:15 AM7/29/05
to
scusate l'ignoranza ma come fate a scrivere quel codice ?
io uso il Design view della console Enterprise Manager ... e mi escono
delle query allucinanti :-( voi con due righe avete ottenuto quello che
volevo ... :-(


Lorenzo Benaglia ha scritto:

Lorenzo Benaglia

unread,
Jul 29, 2005, 5:08:29 AM7/29/05
to
Pasi wrote:
> scusate l'ignoranza ma come fate a scrivere quel codice ?
A mano, usando la testa :-)

Armati dei Books Online, del Query Analyzer ed inizia ad affidarti alla tua
testa e non alle interfaccie "intelligenti" che di intelligente hanno ben
poco :-)

> voi con due righe avete ottenuto quello
> che volevo ... :-(

Oh bene, allora da oggi siamo ufficialmente dei profeti :-D

Ciao!

Marcello

unread,
Jul 29, 2005, 5:08:24 AM7/29/05
to
Ciao,

abbiamo smesso di usare EM!
Abituati a scrivere il codice a mano in QA, hai un controllo molto
maggiore della query, scrivere aiuta moltissimo a focalizzare
l'obiettivo [anzichč checkare caselle e trascinare linee] e permette di
scrivere query leggibili e ottimizzate.
Nel giro qualche tempo il designer di EM diventa un [brutto] ricordo
lontano...

marc.

Pasi ha scritto:


> scusate l'ignoranza ma come fate a scrivere quel codice ?
> io uso il Design view della console Enterprise Manager ... e mi escono
> delle query allucinanti :-( voi con due righe avete ottenuto quello che
> volevo ... :-(
>
>
> Lorenzo Benaglia ha scritto:
>
>
>>Pasi wrote:
>>

>>>io non ci capisco + nulla č troppo tempo che ci ragiono sopra
>>
>>Figurati io!
>>Un esempio piů confuso non potevi farlo.


>>I dati di input sono incompleti ed incoerenti rispetto al risultato che hai
>>postato!!!

>>Non c'č situazione peggiore di questa.

Pasi

unread,
Jul 29, 2005, 5:25:26 AM7/29/05
to
ehmmm mi sbagliavo ... avete ottenuto parzialmente quello che volevo
:-)
la cosa si complica in questo modo ...

il valore delle mie colonne K001 K002 K003 a volta capita che possa
essere il risultato di una formula eseguita aggregando diversi
dispositivi. quindi può capitare che il valore di K001 non sia il
valore che corrispondente all' IDFLOW 1700 ma ad esempio alla somma
dell' IDFLOW 1700 + IDFLOW 1699 in pratica nella mia colonna K001
potrebbero esserci tutte le svariate formule matematiche di
combinazione dei miei dispositivi ...

Esempio :
K001 = (Registratore di cassa IdFLOW 1700 + Registratore di cassa
IdFLOW 1699 - Registratore di cassa IdFLOW 1698)

giorgio rancati

unread,
Jul 29, 2005, 5:28:52 AM7/29/05
to
"Pasi" <emanuele....@gmail.com> ha scritto nel messaggio
news:1122627795.4...@g43g2000cwa.googlegroups.com...

>scusate l'ignoranza ma come fate a scrivere quel codice ?
>io uso il Design view della console Enterprise Manager ... e mi escono
>delle query allucinanti :-( voi con due righe avete ottenuto quello che
>volevo ... :-(

Come gia hanno detto Lorenzo e Marcello non usare EM, ma soprattutto, segui
questo NG, dopo un po' verrà naturale anche a te scrivere il codice in
questo modo.
:-)

Marcello

unread,
Jul 29, 2005, 5:34:46 AM7/29/05
to
Ciao,

beh, ora potresti provare metterci del tuo no? :-)

KCalcolato=sum(case IDFLOW when 1700 then valore
when 1699 then Valore
when 1698 then -Valore
else 0 end)

marc.

Pasi ha scritto:

giorgio rancati

unread,
Jul 29, 2005, 5:39:52 AM7/29/05
to
"Pasi" <emanuele....@gmail.com> ha scritto nel messaggio
news:1122629126....@f14g2000cwb.googlegroups.com...

una volta che hai capito il suggerimento puoi variarlo come meglio credi
----
.....
.....
SUM(CASE IDFLOW WHEN 1700 THEN Valore
WHEN 1699 THEN Valore
WHEN 1698 THEN -Valore
Else 0 END) AS K001
.....
.....
----

Lorenzo Benaglia

unread,
Jul 29, 2005, 5:40:06 AM7/29/05
to

Come stabilisci queste formule?
Che logica seguono?

Se la forumula è costante puoi semplicemente modificare la nostra query:

USE tempdb
GO

) +


SUM(CASE IDFLOW
WHEN 1670 THEN VALORE
ELSE 0
END

) -


SUM(CASE IDFLOW
WHEN 1671 THEN VALORE
ELSE 0
END
) K000
, SUM(CASE IDFLOW
WHEN 1670 THEN VALORE
ELSE 0
END
) K001
, SUM(CASE IDFLOW
WHEN 1671 THEN VALORE
ELSE 0
END
) K002

FROM dbo.Tabella_DATI
WHERE IDFLOW IN(1699, 1670, 1671)
GROUP BY
YEAR(DATAORA)

, DATEPART(dayofyear, DATAORA)


, CONVERT(char(10), DATAORA, 105)
, DATEPART(hour, DATAORA)

GO

/* Output:

ANNO GIORNOANNO GIORNO ORA K000 K001 K002
----- ----------- ---------- ---- ------- ------- -------

2005 73 14-03-2005 0 223.42 182.85 141.28
2005 73 14-03-2005 1 291.82 126.41 .00
2005 73 14-03-2005 2 370.06 182.03 .00

(3 row(s) affected)

*/

/* Pulizia */
DROP TABLE dbo.Tabella_DATI


Nel caso in cui intendevi qualcos'altro, prepara un esempio *COME IL
NOSTRO*, ovvero con la struttura della tabella, alcune righe di prova ed il
risultato CORRETTO che vuoi ottenere.

Pasi

unread,
Jul 29, 2005, 5:59:10 AM7/29/05
to
no , non è quello che mi serviva , ora preparo tutto per non prendermi
bacchettate da Lorenzo
grazie

Pasi

unread,
Jul 29, 2005, 6:53:09 AM7/29/05
to
QUESTA E' LA MIA TABELLA :
Use TempDB

CREATE TABLE [Tbl_Dati1] (
[IdFlow] [bigint] NOT NULL ,
[DataOra] [datetime] NOT NULL ,
[valore] [float] NOT NULL ,
) ON [PRIMARY]
GO

/* La popolo */
SET NOCOUNT ON

INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314', 40.58)
INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314 0:15:00', 46.74)
INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314 0:30:00', 53.96)
INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314 0:45:00', 40.57)
INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314 1:00:00', 44.68)
INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314 1:15:00', 44.69)
INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314 1:30:00', 35.45)
INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314 1:45:00', 40.59)
INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314 2:00:00', 49.84)
INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314 2:15:00', 52.9)
INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314 2:30:00', 35.45)
INSERT dbo.Tbl_Dati1 VALUES(1699, '20050314 2:45:00', 49.84)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314', 40.58)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314 0:15:00', 88.74)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314 0:30:00', 12.96)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314 0:45:00', 40.57)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314 1:00:00', 6.68)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314 1:15:00', 28.69)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314 1:30:00', 35.45)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314 1:45:00', 55.59)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314 2:00:00', 49.84)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314 2:15:00', 81.9)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314 2:30:00', 35.45)
INSERT dbo.Tbl_Dati1 VALUES(1670, '20050314 2:45:00', 14.84)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314', 123.52)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314 0:15:00', 82.74)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314 0:30:00', 34.96)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314 0:45:00', 42.57)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314 1:00:00', 23.68)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314 1:15:00', 45.64)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314 1:30:00', 67.43)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314 1:45:00', 45.59)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314 2:00:00', 76.84)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314 2:15:00', 76.90)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314 2:30:00', 45.45)
INSERT dbo.Tbl_Dati1 VALUES(1671, '20050314 2:45:00', 9.84)
SET NOCOUNT OFF
DROP TABLE dbo.Tbl_Dati1

Le mie formule sono costruite dinamicamente tramite un'interfaccia
utente , quindi l'utente può scegliere di creare qualsiasi genere di
formula con i vari dispositivi ...

in teoria può fare di tutto , dal calcolare la radice quadrata di un
singolo dispositivo o di + dispositivi sommati l'uno con l'altro ecc...
immaginate di avere una calcolatrice a disposizione e di avere la
possibilità di crearvi delle vere e proprie espressioni che hanno come
fattori i vari IDFLOW
Il risultato deve essere lo stesso che abbiamo visto prima pero' con la
diversita' che invece di avere avere per ciascuna colonna K un IDFLOW
ci sono queste espressioni di aggregazione.

grazie mille per l'aiuto

Marcello

unread,
Jul 29, 2005, 7:01:30 AM7/29/05
to
Ciao,

La radice quadrata di un set di record č un'operazione senza alcun
senso, forse intendi operazioni sulle somme dei valori?
Cosa potrebbe essere la radice quadrata di (1,2,3,4)???
Se vuoi permettere operazioni sui totali ti basta creare la prima vista
proposta e manipolare (lato client) appunto i totali.

marc.


Pasi ha scritto:

> utente , quindi l'utente puņ scegliere di creare qualsiasi genere di


> formula con i vari dispositivi ...
>

> in teoria puņ fare di tutto , dal calcolare la radice quadrata di un


> singolo dispositivo o di + dispositivi sommati l'uno con l'altro ecc...
> immaginate di avere una calcolatrice a disposizione e di avere la

> possibilitą di crearvi delle vere e proprie espressioni che hanno come

Pasi

unread,
Jul 29, 2005, 7:22:50 AM7/29/05
to
no , non voglio fare la radice di un set di record
io all'utente metto a disposizione un'interfaccia per crearsi dei
report ,
in pratica l'utente può creare le varie colonne di questo report
Le colonne del report ad esempio possono essere :

K0001 = RADICE ( (valore.idflow[1700]) + (valore.idflow[1699]) )
K0002 = valore.idFlow[1700]
K0003 = (valore.idflow[1700]) *2
K0004 = (valore.idflow[1700]) *2 + (valore.idflow[1699])

l'esempio che mi avete fatto va bene per la K002 non per la K0001
perchè è un singolo Idflow che vado a recuperare

Marcello

unread,
Jul 29, 2005, 7:29:41 AM7/29/05
to
Ciao,

Il problema è se gli operatori vanno applicati a ogni singola riga o ai
totali.
K0001 era fino a un attimo fa una somma su aggregazione ora diventa il
valore associato a un record!

K0001 = RADICE ( (valore.idflow[1700]) + (valore.idflow[1699]) )

Cerca di formulare correttamente la domanda e forse arriviamo a
qualcosa, come ampiamente sottolineato da Lorenzo riporta la struttura
dei dati [l'hai fatto], qualche insert [l'hai fatto] e il risultato che
vorresti ottenere!!!!

Quale estrazione vuoi ottenere? Facci [fatti] un esempio! Riporta
esattamente l'estrazione che associ verbalmente alle parole "faccio la
radice"

marc.

Pasi ha scritto:

Pasi

unread,
Jul 29, 2005, 7:47:50 AM7/29/05
to
Nella tbl_dati ho i valori indicizzati per IDFLOW.

IDFLOW è l'identificativo di un'apparato ... e fin qui ci siamo spero
:-(

ora la richiesta del cliente è : "Voglio poter aggregare i vari
apparati con delle formule, ad esempio voglio sapere i valori
registrati dall'apparato con IDFLOW 1700 sommati a quelli dell'apparato
con IDFLOW 1699 per un certo periodo di tempo e voglio vedere quei
valori accorpati per le ore del giorno"
quindi il risultato della mia query dovrà mostrare una tabella così :

K0001 = SOMMA ( apparato con IDFLOW 1700 + apparato con IDFLOW 1699)
K0002 = apparato con IDFLOW 1700
K0003 = RADICEQUADRATA ( apparato con IDFLOW 1700 + apparato con IDFLOW
1699)

la mia tabella quindi sarà :

Giorno Ora K0001 K0002 K0003
14/03/2005 0 50 45 3.4
14/03/2005 1 54 34 3.3
14/03/2005 2 58 23 45.4
14/03/2005 3 87 43 54.34
14/03/2005 4 856 54 43
14/03/2005 5 554 65 34

N.B i valori sono a caso

Marcello

unread,
Jul 29, 2005, 7:59:01 AM7/29/05
to
Ciao,

> N.B i valori sono a caso

Male, stai scrivendo delle cose senza senso e il senso lo acquisiscono
solo se si cominciano a usare i dati veri!

Diciamo di avere i valori:

ORA IDFLOW Valore
1 1700 1
1 1699 2
1 1700 3

Ora mi chiedi di raggruppare per ora [quindi noi qui abbiamo un solo
gruppo] e calcolare:

> K0001 = SOMMA ( apparato con IDFLOW 1700 + apparato con IDFLOW 1699)

Cioè presumibilmente [forse] intendi:
K0001 = SOMMA (IDFLOW=1700) + SOMMA(IDFLOW 1699)=6

> K0002 = apparato con IDFLOW 1700

Ci sono due "apparato con IDFLOW 1700" come mi comporto durante il
raggruppamento? Quanto dovrebbe fare?

> K0003 = RADICEQUADRATA
>( apparato con IDFLOW 1700 + apparato conIDFLOW 1699)

E qui siamo da capo. La radice delle sum delle somme?
La sum delle radici quadrate di qualcosa?
Che numero dovrebbe venire qui??????

marc.

Pasi ha scritto:

Pasi

unread,
Jul 29, 2005, 8:09:28 AM7/29/05
to
scusami ma non voglio farti spazientire o peggio :-(
il punto è che non riesco a spiegarmi , ho molta confusione in testa e
credo si veda palesemente .
cmq
i dati che ho postato in precedenza sono chiari ?

IDFLOW DATA VALORE
----------------------------------------------------------
1699 14/03/2005 40.58
1699 14/03/2005 0:15:00 46.74
1699 14/03/2005 0:30:00 53.96
1699 14/03/2005 0:45:00 40.57
1699 14/03/2005 1:00:00 44.68
1699 14/03/2005 1:15:00 44.69
1699 14/03/2005 1:30:00 35.45
1699 14/03/2005 1:45:00 40.59
1699 14/03/2005 2:00:00 49.84
1699 14/03/2005 2:15:00 52.9
1699 14/03/2005 2:30:00 35.45
1699 14/03/2005 2:45:00 49.84
1670 14/03/2005 40.58
1670 14/03/2005 0:15:00 88.74
1670 14/03/2005 0:30:00 12.96
1670 14/03/2005 0:45:00 40.57
1670 14/03/2005 1:00:00 6.68
1670 14/03/2005 1:15:00 28.69
1670 14/03/2005 1:30:00 35.45
1670 14/03/2005 1:45:00 55.59
1670 14/03/2005 2:00:00 49.84
1670 14/03/2005 2:15:00 81.9
1670 14/03/2005 2:30:00 35.45
1670 14/03/2005 2:45:00 14.84
1671 14/03/2005 123.52
1671 14/03/2005 0:15:00 82.74
1671 14/03/2005 0:30:00 34.96
1671 14/03/2005 0:45:00 42.57
1671 14/03/2005 1:00:00 23.68
1671 14/03/2005 1:15:00 45.64
1671 14/03/2005 1:30:00 67.43
1671 14/03/2005 1:45:00 45.59
1671 14/03/2005 2:00:00 76.84
1671 14/03/2005 2:15:00 76.9
1671 14/03/2005 2:30:00 45.45
1671 14/03/2005 2:45:00 9.84

Marcello

unread,
Jul 29, 2005, 8:16:50 AM7/29/05
to
Ciao,

i dati sono chiarissimi, non preoccuparti che non mi spazientisco [ mica
me l'ha detto il dottore di rispondere, mi va :-) ]
Potresti rispondere alle seguenti domande, che forse arriviamo al punto?
Dati i dati [ :-) ] semplificati:

1700 14/03/2005 0:00:00 1
1699 14/03/2005 0:00:00 2
1700 14/03/2005 0:00:00 3

Quanto dovresti ottenere con

1) SOMMA ( apparato con IDFLOW 1700 + apparato con IDFLOW 1699)
2) apparato con IDFLOW 1700
3) RADICEQUADRATA( apparato con IDFLOW 1700 + apparato conIDFLOW 1699)

??

dai che mo' ci arriviamo :-)

marc.

Pasi ha scritto:

Pasi

unread,
Jul 29, 2005, 8:23:09 AM7/29/05
to
dovrei ottenere

DATA ORA K0001 K0002 K003
14/03/2005 0 3 1 1.73

giorgio rancati

unread,
Jul 29, 2005, 8:27:50 AM7/29/05
to
"Marcello" <marcello...@epomops.it> ha scritto nel messaggio
news:OX7QodD...@TK2MSFTNGP15.phx.gbl...

>
> dai che mo' ci arriviamo :-)
>

Ciao Marc,

secondo me vuole fare qualcosa del genere
-----
Create function ufn_CalcolaFormula
(@Formula Varchar(100),
@V1670 Float,
@V1671 Float,
@V1699 Float,
@Object int)
RETURNS Float as
BEGIN

Declare @Out varchar(100)

Set @Formula=REPLACE (@Formula,'[1699]',convert(varchar,@V1699))
Set @Formula=REPLACE (@Formula,'[1670]',convert(varchar,@V1670))
Set @Formula=REPLACE (@Formula,'[1671]',convert(varchar,@V1671))

Set @Formula='Eval("'+@Formula+'")'

EXEC sp_OAMethod @Object,
@Formula, @Out OUTPUT
Set @Out=Replace(@Out,',','.')

RETURN Convert(Float,@out)
END
GO

--

DECLARE @Object int
DECLARE @RetVal int
Declare @Out varchar(50)

EXEC @RetVal = sp_OACreate 'MSScriptControl.ScriptControl',
@Object OUTPUT

EXEC @RetVal = sp_OASetProperty @object, 'Language', 'VBScript'


Select Anno,GIORNOANNO,GIORNO,
dbo.ufn_CalcolaFormula('([1699]+[1670])/2',V1699,V1670,V1671,@Object)
AS K0001,

dbo.ufn_CalcolaFormula('[1699]+[1670]+[1671]',V1699,V1670,V1671,@Object) AS
K0002,

dbo.ufn_CalcolaFormula('Sqr([1670]+[1671])',V1699,V1670,V1671,@Object) AS
K0003
From (Select Year(DATAORA) AS Anno,


DatePart(dy,DataOra) AS GIORNOANNO,
Convert(varchar,Dataora,105) as GIORNO,
Datepart(hh,DataOra) AS Ora,

SUM(CASE WHEN IDFLOW=1699 THEN Valore Else 0 END) V1699,
SUM(CASE WHEN IDFLOW=1670 THEN Valore Else 0 END) V1670,
SUM(CASE WHEN IDFLOW=1670 THEN Valore Else 0 END) V1671
From Tbl_Dati1


GROUP BY Year(DATAORA),
DatePart(dy,DataOra),
Convert(varchar,Dataora,105),

Datepart(hh,DataOra)) DrvTbl

EXEC sp_OADestroy @Object

Pasi

unread,
Jul 29, 2005, 8:31:48 AM7/29/05
to
oddio oddio cosa è tutta sta roba :-(
scusate lo ammetto la somma ignoranza :-( ma di sta roba ci capisco ben
poco ...
io programmo in c# e la stringa sql me la costruisco in modo dinamico ,
con tutta sta roba cosa ci devo fare ?
non riesco nemmeno a verificare che funzioni ... :-(

Marcello

unread,
Jul 29, 2005, 8:31:04 AM7/29/05
to
Ciao,

haia... andiamo male... :-(

Allora, i dati sono:

1700 14/03/2005 0:00:00 1
1699 14/03/2005 0:00:00 2
1700 14/03/2005 0:00:00 3

1)

SOMMA ( apparato con IDFLOW 1700 + apparato con IDFLOW 1699) = 3
Questo 3 mi devi spiegare come l'hai ottenuto... è il massimo? E' la
somma dei primi due valori? Perchè il terzo è stato escluso?

2)

apparato con IDFLOW 1700=1
Mi spieghi perchè il valore 3 è stato escluso? E' il minimo?

3)

RADICEQUADRATA( apparato con IDFLOW 1700 + apparato conIDFLOW 1699) = 1.73

Cioè la radice quadrata del punto 1) che però non ho capito...


Ancora spiegazioni...
:-(

marc.


Pasi ha scritto:

giorgio rancati

unread,
Jul 29, 2005, 8:34:09 AM7/29/05
to
"giorgio rancati" <giorgio_No_Sp...@tiscali.it> ha scritto nel
messaggio news:e0cLiiDl...@TK2MSFTNGP12.phx.gbl...

ops
anche se non č determinante per il concetto l'ultima case č sbagliata


>SUM(CASE WHEN IDFLOW=1670 THEN Valore Else 0 END) V1671

ovviamente va scritta cosě
---
SUM(CASE WHEN IDFLOW=1671 THEN Valore Else 0 END) V1671

Marcello

unread,
Jul 29, 2005, 8:38:09 AM7/29/05
to
Ciao,

si anch'io sono persuaso che Pasi voglia fare una cosa del genere.
Cioè che voglia creare formule per manipolare i totali [lato SQL a me
sembra eccessivo e delegherei al client, ma questo è un'altro discorso].
Ma le risposte sono un po' troppo confuse e cerco di capire se ho
capito! :-)

marc.

giorgio rancati ha scritto:

giorgio rancati

unread,
Jul 29, 2005, 8:45:50 AM7/29/05
to
"Pasi" <emanuele....@gmail.com> ha scritto nel messaggio
news:1122640307.9...@g43g2000cwa.googlegroups.com...


be, ma se la stringa la costruisci in modo dinamico allora è un altro paio
di maniche,

puoi basarti su una query tipo questa
----
Select Anno,GIORNOANNO,GIORNO,
<<<formule composte in modo dinamico>>>


From (Select Year(DATAORA) AS Anno,
DatePart(dy,DataOra) AS GIORNOANNO,
Convert(varchar,Dataora,105) as GIORNO,
Datepart(hh,DataOra) AS Ora,
SUM(CASE WHEN IDFLOW=1699 THEN Valore Else 0 END) V1699,
SUM(CASE WHEN IDFLOW=1670 THEN Valore Else 0 END) V1670,
SUM(CASE WHEN IDFLOW=1670 THEN Valore Else 0 END) V1671
From Tbl_Dati1
GROUP BY Year(DATAORA),
DatePart(dy,DataOra),
Convert(varchar,Dataora,105),
Datepart(hh,DataOra)) DrvTbl

----

e poi componi la parte delle formule dal client.
L'esempio considera solo le somme di tre valori per IDFLOW, tu dovrai
includere nella tabella derivata tutte le somme necessarie.

Pasi

unread,
Jul 29, 2005, 8:53:58 AM7/29/05
to
ecco così forse ci siamo ...
dove hai scritto :<<<formule composte in modo dinamico>>>
riesci a mettermi un'esempio senza di mezzo la funzione di sql

giorgio rancati

unread,
Jul 29, 2005, 8:58:25 AM7/29/05
to
"Marcello" <marcello...@epomops.it> ha scritto nel messaggio
news:%23mb2ipD...@TK2MSFTNGP15.phx.gbl...

> Ciao,
>
> si anch'io sono persuaso che Pasi voglia fare una cosa del genere.
> Cioč che voglia creare formule per manipolare i totali [lato SQL a me
> sembra eccessivo e delegherei al client, ma questo č un'altro discorso].

> Ma le risposte sono un po' troppo confuse e cerco di capire se ho
> capito! :-)

si, scusa Marcello, forse sono intervenuto in modo improprio
:-)

Pasi

unread,
Jul 29, 2005, 9:01:07 AM7/29/05
to
non ho fatto caso ma i tuoi dati sono sbagliati ...
l'idflow è univoco

Ecco i dati corretti


1700 14/03/2005 0:00:00 1
1699 14/03/2005 0:00:00 2

1701 14/03/2005 0:00:00 3

cmq il valore 3 è appunto la somma di
valore.Iflow[1700]+valore.Iflow[1699]

il valore 1 è valore.Iflow[1700]

il valore 1.73 è la SQRT(valore.Iflow[1700]+valore.Iflow[1699])
capito ?

Marcello

unread,
Jul 29, 2005, 9:00:07 AM7/29/05
to
Ciao,

nonnò, macchè "improprio", più siamo a cercare di capirci qualcosa più
forse il povero Pasi ha delle possibilità di ricevere un aiuto.

:-) marc.

giorgio rancati ha scritto:


> "Marcello" <marcello...@epomops.it> ha scritto nel messaggio
> news:%23mb2ipD...@TK2MSFTNGP15.phx.gbl...
>
>>Ciao,
>>
>>si anch'io sono persuaso che Pasi voglia fare una cosa del genere.

>>Cioè che voglia creare formule per manipolare i totali [lato SQL a me
>>sembra eccessivo e delegherei al client, ma questo è un'altro discorso].

Pasi

unread,
Jul 29, 2005, 9:02:18 AM7/29/05
to
Marcello scusami
i tuoi dati che mi hai mostrato non c'ho fatto caso ma sono diversi dai
dati che ti ho postato ...
l'idflow è univoco

1700 14/03/2005 0:00:00 1


1699 14/03/2005 0:00:00 2

1701 14/03/2005 0:00:00 3

quindi per rispondere alla tua domanda la somma di 1700+1699 = 3
1700 = 1
SQRT(1701) = 3

è + chiaro ora ?

giorgio rancati

unread,
Jul 29, 2005, 9:04:46 AM7/29/05
to
"Pasi" <emanuele....@gmail.com> ha scritto nel messaggio
news:1122641638.4...@g14g2000cwa.googlegroups.com...
>ecco cosě forse ci siamo ...

>dove hai scritto :<<<formule composte in modo dinamico>>>
>riesci a mettermi un'esempio senza di mezzo la funzione di sql

devi essere tu a comporla lato client, se il tuo utente scrive

K0001= RADICEQUADRATA(1700 + 1690)

andrai ad inserire SQRT(V1700+V1690) AS K0001

Pasi

unread,
Jul 29, 2005, 9:09:14 AM7/29/05
to
riesci a scrivermi la query completa senza la funzione sql ?

Marcello

unread,
Jul 29, 2005, 9:14:26 AM7/29/05
to
Ciao,

E' chiaro si! la coppia idflow, Data [non il solo idflow] costituiscono
una chiave univoca!!!!!
Non vorrei polemizzare ma non ti sembra cosě a naso un fatto abbastanza
importante che forse andava precisato prima?
O non ho letto io?
Comunque allora cambia tutto quanto!
Se c'č un unico valore allora la questione radice quadrata prima o dopo
decade poichč le somme sono tutte fittizie.

Allora, facciamo un centinaio di passi indietro. Abbiamo la vista:

select Anno=year(DataOra),
GiornoAnno=datepart(dy,DataOra),
Giorno=convert(varchar,DataOra,105),
Ora=datepart(hh,DataOra),
K000=sum(case IDFLOW when 1700 then valore else 0 end),
K001=sum(case IDFLOW when 1670 then valore else 0 end),
K002=sum(case IDFLOW when 1699 then valore else 0 end)
from tabella
group by year(DataOra),datepart(dy,DataOra),
convert(varchar,DataOra,105),datepart(hh,DataOra)

[con la nuova informazione questa vista potrebbe essere pure riscritta
ma per il momento sorvoliamo].
Questa vista non č altro che una tabella Pivot che converrebbe salvarsi
nel db con una sintassi tipo:

create view EccoLaMiaVista
as
select Anno=year(DataOra),
GiornoAnno=datepart(dy,DataOra),
Giorno=convert(varchar,DataOra,105),
Ora=datepart(hh,DataOra),
K000=sum(case IDFLOW when 1700 then valore else 0 end),
K001=sum(case IDFLOW when 1670 then valore else 0 end),
K002=sum(case IDFLOW when 1699 then valore else 0 end)
from tabella
group by year(DataOra),datepart(dy,DataOra),
convert(varchar,DataOra,105),datepart(hh,DataOra)

ora puoi recuperare i dati da c# con una sintassi molto piů semplice del
tipo:

select * from EccoLaMiaVista

e eventualmente manipolare i dati con sintassi complicate a piacere del
tipo:

select K000*2+K001-K002,
abs(power(K000,2)-6),
K000+K001
from EccoLaMiaVista

marc.

Pasi ha scritto:


> Marcello scusami
> i tuoi dati che mi hai mostrato non c'ho fatto caso ma sono diversi dai
> dati che ti ho postato ...

> l'idflow č univoco


>
> 1700 14/03/2005 0:00:00 1
> 1699 14/03/2005 0:00:00 2
> 1701 14/03/2005 0:00:00 3
>
> quindi per rispondere alla tua domanda la somma di 1700+1699 = 3
> 1700 = 1
> SQRT(1701) = 3
>

> č + chiaro ora ?
>

Pasi

unread,
Jul 29, 2005, 9:24:11 AM7/29/05
to
si ma le colonne sono variabili e gli IDFLOW sono migliaia .. non mi
sembra il caso di fare una vista con 1700 colonne no ?
soprattutto perchè il cliente mi chiederà solo alcuni di questi per
ciascun report

Marcello

unread,
Jul 29, 2005, 9:29:35 AM7/29/05
to
Ciao,

OK, si potrebbero costruire delle stored ma la questione si complica un
po', siamo quindi arrivati alla soluzione di Giorgio.

Costruisci dinamicamente un stringa analoga a:

select Anno=year(DataOra),
GiornoAnno=datepart(dy,DataOra),
Giorno=convert(varchar,DataOra,105),
Ora=datepart(hh,DataOra),
K000=sum(case IDFLOW when 1700 then valore else 0 end),
K001=sum(case IDFLOW when 1670 then valore else 0 end),
K002=sum(case IDFLOW when 1699 then valore else 0 end)
from tabella
group by year(DataOra),datepart(dy,DataOra),
convert(varchar,DataOra,105),datepart(hh,DataOra)

in cui appare una riga del tio

K000=sum(case IDFLOW when 1700 then valore else 0 end)

per ogni IDFLOW scelto.

Sia strView questa stringa.
Le elaborazioni saranno del tipo:

select K000*2+K001-K002,
abs(power(K000,2)-6),
K000+K001
from ( xxx )v

dove xxx è da sostituire con strView.

marc.

Pasi ha scritto:

Pasi

unread,
Jul 29, 2005, 9:43:47 AM7/29/05
to
COSI ?

select Anno=year(DataOra),
GiornoAnno=datepart(dy,DataOra),
Giorno=convert(varchar,DataOra,105),
Ora=datepart(hh,DataOra),

select K000*2+K001-K002,abs(power(K000,2)-6),K000+K001
from (


K000=sum(case IDFLOW when 1700 then valore else 0 end),
K001=sum(case IDFLOW when 1670 then valore else 0 end),
K002=sum(case IDFLOW when 1699 then valore else 0 end)

)


from tbl_dati1
group by year(DataOra),datepart(dy,DataOra),
convert(varchar,DataOra,105),datepart(hh,DataOra)

Marcello

unread,
Jul 29, 2005, 9:53:18 AM7/29/05
to
Ciao,

no, cosě:

select K000*2+K001-K002,abs(power(K000,2)-6),K000+K001
from
(


select Anno=year(DataOra),
GiornoAnno=datepart(dy,DataOra),
Giorno=convert(varchar,DataOra,105),
Ora=datepart(hh,DataOra),

K000=sum(case IDFLOW when 1700 then valore else 0 end),
K001=sum(case IDFLOW when 1670 then valore else 0 end),
K002=sum(case IDFLOW when 1699 then valore else 0 end)

from tabella
group by year(DataOra),datepart(dy,DataOra),
convert(varchar,DataOra,105),datepart(hh,DataOra)

)v


marc.


Pasi ha scritto:

Pasi

unread,
Jul 29, 2005, 10:00:41 AM7/29/05
to
mi da errore :
Server: Msg 170, Level 15, State 1, Line 13
Line 13: Incorrect syntax near ')'.

select K000*2+K001-K002,abs(power(K000,2)-6),K000+K001
from
(
select Anno=year(DataOra),
GiornoAnno=datepart(dy,DataOra),
Giorno=convert(varchar,DataOra,105),
Ora=datepart(hh,DataOra),
K000=sum(case IDFLOW when 1700 then valore else 0 end),
K001=sum(case IDFLOW when 1670 then valore else 0 end),
K002=sum(case IDFLOW when 1699 then valore else 0 end)

from tbl_dati1
group by
year(DataOra),datepart(dy,DataOra),convert(varchar,DataOra,105),datepart(hh,DataOra)
)

Marcello

unread,
Jul 29, 2005, 10:02:28 AM7/29/05
to
Ciao,

ma perchè togli la v?

select K000*2+K001-K002,abs(power(K000,2)-6),K000+K001
from
(
select Anno=year(DataOra),
GiornoAnno=datepart(dy,DataOra),
Giorno=convert(varchar,DataOra,105),
Ora=datepart(hh,DataOra),
K000=sum(case IDFLOW when 1700 then valore else 0 end),
K001=sum(case IDFLOW when 1670 then valore else 0 end),
K002=sum(case IDFLOW when 1699 then valore else 0 end)

from tabella
group by year(DataOra),datepart(dy,DataOra),
convert(varchar,DataOra,105),datepart(hh,DataOra)
)v

marc.

Pasi ha scritto:

Pasi

unread,
Jul 29, 2005, 10:08:41 AM7/29/05
to
mi spieghi a cosa serve ?

Marcello

unread,
Jul 29, 2005, 10:13:57 AM7/29/05
to
Ciao,

č l'alias della sub query

L'istruzione SELECT funziona (detto molto alla spicciola) con una
sintassi tipo

Select * from x

dove x č il nome di un oggetto su cui č possibile eseguire una selezione.

Nel caso di subquery ci si trova nella situazione:

select * from (select * from x)

ma il pezzo "(select * from x)" per essere riconosciuto deve essere
"nominato" con un alias, per esempio

select * from
(select * from x) AS SottoQuery

Se al posto del nome SottoQuery si usa un piů stringato "v" e si omette
la particella facoltativa "AS" si ottiene

select * from
(select * from x)v

dove "v" č in nome dell'estrazione "(select * from x)"

marc.

Pasi ha scritto:

Pasi

unread,
Jul 30, 2005, 8:13:21 AM7/30/05
to
ci siamo già sentiti via email cmq ti volevo ringraziare pubblicamente
per il grosso aiuto che mi hai dato, ringrazio anche Giorgio che è
stato di grande aiuto per arrivare ad una conclusione della mia
tribolata vicenda ...

volevo chiedervi un'ultima cosa se dovessi ora fare un JOIN con una
tabella (tbl_tariffe)che ha questo schema

GIORNO ORA TARIFFA
14/03/2005 0 5
14/03/2005 1 6
14/03/2005 2 5

per e ottenere questo risultato
DATA ORA K0001 K0002 K003 TARIFFA
14/03/2005 0 3 1 1.73 5
14/03/2005 0 24 54 1.73 6
14/03/2005 0 23 12 1.73 5

grazie mille

Marcello

unread,
Jul 30, 2005, 8:18:36 AM7/30/05
to
Ciao,

ormai dovresti avere capito il funzionamento delle subqueries, quindi
avrai una cosa tipo:

select s.*,t.Tariffa
from
(
query principale di calcolo raggruppamenti
) as s
left outer join tbl_tariffe as t
on t.Ora=s.Ora

Osserva che ho usato una left join, non sapendo se tbl_tariffe contiene
sempre una riga per ogni possibile ora, in caso affermativo sarebbe più
appropriata una join naturale (inner).

marc.

Pasi ha scritto:

Pasi

unread,
Jul 30, 2005, 8:20:07 AM7/30/05
to
correggo il messaggio precedente scusate ...
questo è il risultato che devo ottenere ...

DATA ORA K0001 K0002 K003 TARIFFA
14/03/2005 0 3 1 1.73 5
14/03/2005 1 24 54 1.73 6
14/03/2005 2 23 12 1.73 5

Pasi

unread,
Jul 31, 2005, 12:10:02 PM7/31/05
to
diciamo che + o meno ce l'ho fatta ( + o - ) ora se invece volessi
visualizzare i dati singolarmente senza raggrupparli per ora e
ottenerre questo risultato:


DATAORA K0001
14/03/2005 54.5
14/03/205 00:15 65.78
14/03/205 00:30 211.54
14/03/205 00:45 878.9
14/03/205 01:00 54.55
14/03/205 01:15 578.48
14/03/205 01:30 545.4
14/03/205 01:45 58.87

io ho fatto :

SELECT K0001,K0002,(K0002+K0001) AS Somma,DataOra,GA,Anno

FROM
(
SELECT DataOra,GA = DATEPART(dy,DataOra),Anno = DATEPART(yyyy,DataOra),

K0001 = CASE IDFLOW WHEN 1699 THEN valore ELSE 0 END,
K0002 = CASE IDFLOW WHEN 1698 THEN valore ELSE 0 END

>From Tbl_dati
/*GROUP BY DataOra,DATEPART(dy,DataOra)*/

)V WHERE anno = 2005 AND GA >= 73 AND GA <82 ORDER BY anno,GA


ma mi escono una sfilza di zeri :-(

0 new messages