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) }
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
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.
riesci ad indicarmene altre magari più efficaci ?
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
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...
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:
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
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]
Lorenzo Benaglia ha scritto:
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!
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.
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)
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.
:-)
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:
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
.....
.....
----
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.
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
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
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
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:
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
> 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:
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
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:
DATA ORA K0001 K0002 K003
14/03/2005 0 3 1 1.73
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
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:
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
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:
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.
si, scusa Marcello, forse sono intervenuto in modo improprio
:-)
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 ?
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].
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 ?
devi essere tu a comporla lato client, se il tuo utente scrive
K0001= RADICEQUADRATA(1700 + 1690)
andrai ad inserire SQRT(V1700+V1690) AS K0001
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 ?
>
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:
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)
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:
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)
)
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:
č 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:
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
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:
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 :-(