Union all non funzionante?

di il
10 risposte

Union all non funzionante?

Ciao a tutti,
ho questa query:
select data, cast((((ore*60.0)+minuti)/60) as decimal(10,2)) as change
			  from mainGrid
			  where username = 'mario_bianchi' and
			  YEAR(data) = 2020 and
			  MONTH(data) = 5 and
			  eventType = 'Change' 
			  union all
select data, cast((((ore*60.0)+minuti)/60) as decimal(10,2)) as servicerequest
			  from mainGrid
			  where username = 'mario_bianchi' and
			  YEAR(data) = 2020 and
			  MONTH(data) = 5 and
			  eventType = 'Service request'
			  union all
select data, cast((((ore*60.0)+minuti)/60) as decimal(10,2)) as servizio
			  from mainGrid
			  where username = 'mario_bianchi' and
			  YEAR(data) = 2020 and
			  MONTH(data) = 5 and
			  eventType = 'Servizio'
che mi restituisce questa tabella:
   data	       change
2020-05-30	9.15
2020-05-12	8.13
Io però voglio che mi visualizzi anche le colonne di "servicerequest" e di "servizio" ovvero:
   
data		change	   servicerequest		servizio
2020-05-30	 9.15		8.15			  4.5
2020-05-12	 8.13		1.2			  1.4
Idee?

Grazie, Elias.

10 Risposte

  • Re: Union all non funzionante?

    Prova a mettere nella prima query anche i campi ServiceRequest e servizio impostati a zero (i.e. 0.0 as ServiceRequest, 0.0 as servizio) e generalmente in tutte le query devi avere lo stesso numero di campi (magari anche nello stesso ordine).

    Modificato da max : correzione errore
  • Re: Union all non funzionante?

    Non si capisce mica tanto cosa vuoi fare perchè servicerequest
    lo hai usato come alias nella seconda query della union e, per come funziona la UNION,
    viene ignorato perchè contano solo i nomi della colonna che metti nella prima query;
    idem per l'alias Servizio nella terza query della union.

    Detto in altre parole, la UNION non aggiunge colonne come forse erroneamente credevi.

    Potrebbe andarti bene una cosa del genere ?
    
    select 'Change'  as EventType, data, cast((((ore*60.0)+minuti)/60) as decimal(10,2)) as ValoreTipoRecord
    			  from mainGrid
    			  where username = 'mario_bianchi' and
    			  YEAR(data) = 2020 and
    			  MONTH(data) = 5 and
    			  eventType = 'Change' 
    			  union all
    select 'Service request' , data, cast((((ore*60.0)+minuti)/60) as decimal(10,2))
    			  from mainGrid
    			  where username = 'mario_bianchi' and
    			  YEAR(data) = 2020 and
    			  MONTH(data) = 5 and
    			  eventType = 'Service request'
    			  union all
    select 'Servizio' , data, cast((((ore*60.0)+minuti)/60) as decimal(10,2))
    			  from mainGrid
    			  where username = 'mario_bianchi' and
    			  YEAR(data) = 2020 and
    			  MONTH(data) = 5 and
    			  eventType = 'Servizio'
    
    
  • Re: Union all non funzionante?

    No. La tua query mi restituisce questa tabella:


    domanda_maingrid1tabellaorigi.png
    domanda_maingrid1tabellaorigi.png


    Il programma che sto creando è un programma per la gestione delle ore di lavoro. L'utente può inserire, per ogni giornata, le ore che ha lavorato suddivise per eventType. Quindi ad esempio può inserire 2.5 ore attività di tipo (eventType) = "Change", n ore di tipo = "Service request" e n ore di tipo "Servizio". Quindi io ho bisogno di avere un risultato di questo tipo:


    domanda_maingrid1tabellafinale.png
    domanda_maingrid1tabellafinale.png


    Grazie in anticipo a chiunque mi aiuterà.
  • Re: Union all non funzionante?

    Secondo me comunque non ti serve una union query ma un qualcosa del genere :
    
    select data,
    iif(eventType = 'Change', cast((((ore*60.0)+minuti)/60) as decimal(10,2)), 0.0) as change,
    iif(eventType = 'Service request', cast((((ore*60.0)+minuti)/60) as decimal(10,2)), 0.0) as servicerequest,
    iif(eventType = 'Servizio', cast((((ore*60.0)+minuti)/60) as decimal(10,2)), 0.0) as servizio
    			  from mainGrid
    			  where username = 'mario_bianchi' and
    			  YEAR(data) = 2020 and
    			  MONTH(data) = 5 and
    			  (eventType = 'Change' OR  eventType = 'Service request' OR  eventType = 'Servizio')
    
    Occhio ad eventuali errori di sintassi ...
  • Re: Union all non funzionante?

    Si penso anche io. Però voglio raggruppare per data e visualizzare tutti i dati su una riga. Alla tua query ho provato ad aggiungere la group by e l'order by:
    select data,
    iif(eventType = 'Change', cast((((ore*60.0)+minuti)/60) as decimal(10,2)), 0.0) as change,
    iif(eventType = 'Service request', cast((((ore*60.0)+minuti)/60) as decimal(10,2)), 0.0) as servicerequest,
    iif(eventType = 'Servizio', cast((((ore*60.0)+minuti)/60) as decimal(10,2)), 0.0) as servizio
    			  from mainGrid
    			  where username = 'elias_murgia' and
    			  YEAR(data) = 2020 and
    			  MONTH(data) = 5 and
    			  (eventType = 'Change' OR  eventType = 'Service request' OR  eventType = 'Servizio')
    group by data,eventType, ore, minuti
    order by data
    che mi da questi risultati:

    domanda_maingrid1tabellafinale2.png
    domanda_maingrid1tabellafinale2.png

  • Re: Union all non funzionante?

    Sono arrivato al 99% di quello che ti serve ... fai uno sforzo e raggruppa per anno/mese !
  • Re: Union all non funzionante?

    Salve,
    non ho ben compreso l'utilita' del raggruppamento
    
    ...
        group by data,eventType, ore, minuti
    personalmente, va bene filtrando per data (anno e mese) e per [username], sempre che abbia ben compreso la richiesta, opterei come segue, brutalmente
    
    SET NOCOUNT ON;
    DECLARE @mainGrid table (
    	username varchar(20),
    	eventType varchar(20),
    	data date,
    	ore int,
    	minuti int
    	);
    INSERT INTO @mainGrid 
    	VALUES	( 'mario_bianchi', 'Change', '2020-01-01', 0, 30 ),
    			( 'mario_bianchi', 'Change', '2020-01-02', 1, 30 ),
    			( 'mario_bianchi', 'Change', '2020-01-03', 2, 30 ),
    			( 'mario_bianchi', 'Change', '2020-01-04', 3, 30 ),
    			
    			( 'mario_bianchi', 'Service request', '2020-01-01', 1, 30 ),
    			( 'mario_bianchi', 'Service request', '2020-01-03', 0, 30 ),
    			( 'mario_bianchi', 'Service request', '2020-01-04', 4, 30 ),
    			( 'mario_bianchi', 'Service request', '2020-01-05', 5, 30 ),
    			( 'mario_bianchi', 'Service request', '2020-01-06', 6, 30 ),
    
    			( 'mario_bianchi', 'Servizio', '2020-01-01', 0, 30 ),
    			( 'mario_bianchi', 'Servizio', '2020-01-02', 1, 30 ),
    			( 'mario_bianchi', 'Servizio', '2020-01-05', 2, 30 ),
    			( 'mario_bianchi', 'Servizio', '2020-01-06', 4, 30 );
    
    DECLARE @userName varchar(20) = 'mario_bianchi';
    DECLARE @month int = 1;
    DECLARE @year int = 2020;
    
    SELECT g.[data] --, g.[username]
    	, SUM(
    			CASE WHEN g.[eventType] = 'Change' THEN 
    				g.[ore] * 60.0 + g.[minuti]
    			ELSE 0.0
    			END
    		) AS [Change]
    	, SUM(
    			CASE WHEN g.[eventType] = 'Service request' THEN 
    				g.[ore] * 60.0 + g.[minuti]
    			ELSE 0.0
    			END
    		) AS [Service request]
    	, SUM(
    			CASE WHEN g.[eventType] = 'Servizio' THEN 
    				g.[ore] * 60.0 + g.[minuti]
    			ELSE 0.0
    			END
    		) AS [Servizio]
    
    	FROM @mainGrid g
    	WHERE	DATEPART(YY, g.[data]) = @year
    		AND DATEPART(M, g.[data]) = @month
    		AND g.[username] = @userName 
    		AND g.[eventType] IN ('Change', 'Service request', 'Servizio')
    	GROUP BY g.[data]
    		--, g.[username]
    		;
    
    -- probabilmente, al fine di fare i "calcoli" una sola volta, utilizzerei una CTE di pre-calcolo unificata per poi effettuare la rotazione in colonna nella proiezione successiva
    WITH cteAggregate AS (
    	SELECT g.[data] --, g.[username]
    		, g.[eventType]
    		, g.[ore] * 60.0 + g.[minuti] AS [value]
    		FROM @mainGrid g
    		WHERE	DATEPART(YY, g.[data]) = @year
    			AND DATEPART(M, g.[data]) = @month
    			AND g.[username] = @userName 
    			AND g.[eventType] IN ('Change', 'Service request', 'Servizio')
    	)
    	SELECT g.[data] --, g.[username]
    		, SUM(
    				CASE WHEN g.[eventType] = 'Change' THEN g.[value] ELSE 0 END
    			) AS [Change]
    
    		, SUM(
    				CASE WHEN g.[eventType] = 'Service request' THEN g.[value] ELSE 0 END
    			) AS [Service request]
    
    		, SUM(
    				CASE WHEN g.[eventType] = 'Servizio' THEN g.[value] ELSE 0 END
    			) AS [Servizio]
    
    		FROM cteAggregate g
    		GROUP BY g.[data]
    				--, g.[username]
    				;
    
    --<----------
    data       Change     Service request   Servizio
    ---------- ---------- ----------------- ---------
    2020-01-01 30.0       90.0              30.0
    2020-01-02 90.0       0.0               90.0
    2020-01-03 150.0      30.0              0.0
    2020-01-04 210.0      270.0             0.0
    2020-01-05 0.0        330.0             150.0
    2020-01-06 0.0        390.0             270.0
    
    
    saro' poi molto "old-style", ma l'utilizzo dell' immediate-if (IIF) non riesco ancora a farmelo piacere in T-SQL, ma e' un gusto personale
    salutoni
    --
    Andrea
  • Re: Union all non funzionante?

    Volendo si potrebbe usare anche una PIVOT
    
    SELECT  data, [Change], [Service request] , [Servizio]
    FROM  
    (
    	SELECT eventType,  data, g.[ore] * 60.0 + g.[minuti] as Minuti
    	FROM @mainGrid g
    	where g.eventtype IN ('Change', 'Service request', 'Servizio')
    	  and g.username='mario_bianchi'
    	  -- and data ...
    ) as SourceTable  
    PIVOT  
    (  
    	SUM(Minuti)
    	FOR eventType IN ([Change], [Service request], [Servizio])
    ) AS PivotTable
    ORDER BY data
    
  • Re: Union all non funzionante?

    Ciao sspintux!
    La tua query mi da il risultato che mi serve però io ho bisogno di un conteggio fatto in questo modo:
    SELECT  data, [Change], [Service request] , [Servizio]
    FROM  
    (
    	SELECT eventType,  cast((((Ore*60.0)+Minuti)/60) as decimal(10,2)) as totali
    	FROM mainGrid g
    	where g.eventtype IN ('Change', 'Service request', 'Servizio')
    	  and g.username='elias_murgia'
    	  -- and data ...
    ) as SourceTable  
    PIVOT  
    (  
    	totali
    	FOR eventType IN ([Change], [Service request], [Servizio])
    ) AS PivotTable
    ORDER BY data
    Ovvero non il conteggio semplice fatto dalla somma dei minuti ma il valore in "Giorni" con la virgola e due valori decimali che sarebbe questa formula:
    
    cast((((Ore*60.0)+Minuti)/60) as decimal(10,2))
    
    Come vedi, ho provato a metterlo nella select ma non funziona. Me la puoi adattare con i giorni fatti con la cast come scritto sopra per favore?
    Grazie 1000 intanto per il supporto!

    Elias.
  • Re: Union all non funzionante?

    Mettici un pò anche del tuo ... intervieni nella select sopra
Devi accedere o registrarti per scrivere nel forum
10 risposte