Affiancare più tabelle

domenica 11 marzo 2007 - 10.02

nullatore Profilo | Junior Member

Devo mostrare 4 SELECT COUNT(*) effettuati su 4 tabelle diverse.

SELECT COUNT(*) as cx1 FROM tabella1
SELECT COUNT(*) as cx2 FROM tabella2
SELECT COUNT(*) as cx3 FROM tabella3
SELECT COUNT(*) as cx4 FROM tabella4

Vorrei compattare il tutto e creare una vista che mi mostri tutt'e quattro i valori.

Ma non so come fare l'affiancamento di piu' tabelle...

Ciao

alx_81 Profilo | Guru

>Devo mostrare 4 SELECT COUNT(*) effettuati su 4 tabelle diverse.
>
>SELECT COUNT(*) as cx1 FROM tabella1
>SELECT COUNT(*) as cx2 FROM tabella2
>SELECT COUNT(*) as cx3 FROM tabella3
>SELECT COUNT(*) as cx4 FROM tabella4
>
>Vorrei compattare il tutto e creare una vista che mi mostri tutt'e
>quattro i valori.
>
>Ma non so come fare l'affiancamento di piu' tabelle...
>
>Ciao
>
Ciao
Che DBMS utilizzi?

Alx81 =)

http://blogs.dotnethell.it/suxstellino

nullatore Profilo | Junior Member

è vero...my fault

MsSql2005

alx_81 Profilo | Guru

>Devo mostrare 4 SELECT COUNT(*) effettuati su 4 tabelle diverse.
>
>SELECT COUNT(*) as cx1 FROM tabella1
>SELECT COUNT(*) as cx2 FROM tabella2
>SELECT COUNT(*) as cx3 FROM tabella3
>SELECT COUNT(*) as cx4 FROM tabella4
>
>Vorrei compattare il tutto e creare una vista che mi mostri tutt'e
>quattro i valori.
>
>Ma non so come fare l'affiancamento di piu' tabelle...
>
>Ciao
>
Dunque, esiste un operatore, UNION che utililizzato con l'opzione ALL ti consente di unire i tuoi quattro resultset in uno solo con quattro righe. Specifica la ALL, altrimenti, se due conteggi risultassero uguali, sql li raggrupperebbe, eliminandoti righe per te molto utili.
leggi questo link

UNION (Transact-SQL)
http://msdn2.microsoft.com/en-us/library/ms180026.aspx

Quindi, o tramite designer di SQL Server Management Studio (che a differenza di SQL Server 2000 Enterprise Manager ti consente l'utilizzo dell'operatore UNION) oppure tramite CREATE VIEW (link: http://msdn2.microsoft.com/en-us/library/ms187956.aspx), utilizza il seguente codice per ottenere ciò che ti serve:

SELECT COUNT(*) as Conteggio FROM tabella1 UNION ALL SELECT COUNT(*) FROM tabella2 UNION ALL SELECT COUNT(*) FROM tabella3 UNION ALL SELECT COUNT(*) FROM tabella4

In questo modo otterrai il seguente resultset (esempio):

Conteggio
------------------------
50
33
21
107

In maniera posizionale, otterrai il conteggio di ogni tabella. Volendo puoi arricchire la query con l'aggiunta di un id fisso che identifica quale conteggio corrisponde a quale tabella.
Se al contrario quello che ti serve è una rappresentazione su riga dei tuoi conteggi, allora ti consiglio il seguente codice.
Fai attenzione però, poichè non è possibile utilizzarlo nelle viste (che sono tabelle virtuali e che quindi non permettono l'utilizzo di parametri e/o variabili). Comunque sia puoi scriverti una stored procedure apposita oppure una funzione che ti ritorni una tabella.
-- variabili di conteggio DECLARE @cx1 int, @cx2 int, @cx3 int, @cx4 int -- ricavo i conteggi presi distintamente SELECT @cx1 = COUNT(*) FROM tabella1 SELECT @cx2 = COUNT(*) FROM tabella2 SELECT @cx3 = COUNT(*) FROM tabella3 SELECT @cx4 = COUNT(*) FROM tabella4 -- ritorno il resultset su riga select @cx1, @cx2, @cx3, @cx4

Spero di essere stato sufficientemente chiaro.
ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

nullatore Profilo | Junior Member

immaginavo che dovessi passare dalle SP. Grazie mille

lbenaglia Profilo | Guru

>Se al contrario quello che ti serve è una rappresentazione su
>riga dei tuoi conteggi, allora ti consiglio il seguente codice.
>Fai attenzione però, poichè non è possibile utilizzarlo nelle
>viste (che sono tabelle virtuali e che quindi non permettono
>l'utilizzo di parametri e/o variabili). Comunque sia puoi scriverti
>una stored procedure apposita oppure una funzione che ti ritorni
>una tabella.
>
>-- variabili di conteggio
>DECLARE @cx1 int,
> @cx2 int,
> @cx3 int,
> @cx4 int
>
>-- ricavo i conteggi presi distintamente
>SELECT @cx1 = COUNT(*) FROM tabella1
>SELECT @cx2 = COUNT(*) FROM tabella2
>SELECT @cx3 = COUNT(*) FROM tabella3
>SELECT @cx4 = COUNT(*) FROM tabella4
>
>-- ritorno il resultset su riga
>select @cx1, @cx2, @cx3, @cx4
>

Ciao Alx81,

Propongo un esempio che può essere tranquillamente utilizzato anche in una vista:

USE Northwind; SELECT MAX(Categories) AS Categories , MAX(Customers) AS Customers , MAX(Employees) AS Employees , MAX(Orders) AS Orders FROM ( SELECT COUNT(*) AS Categories , 0 AS Customers , 0 AS Employees , 0 AS Orders FROM dbo.Categories UNION ALL SELECT 0 , COUNT(*) , 0 , 0 FROM dbo.Customers UNION ALL SELECT 0 , 0 , COUNT(*) , 0 FROM dbo.Employees UNION ALL SELECT 0 , 0 , 0 , COUNT(*) FROM dbo.Orders ) AS Q; /* Output: Categories Customers Employees Orders ----------- ----------- ----------- ----------- 8 91 9 830 (1 row(s) affected) */

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

alx_81 Profilo | Guru

>Ciao Alx81,
Ciao Lorenzo!
>
>Propongo un esempio che può essere tranquillamente utilizzato
>anche in una vista:
>
>USE Northwind;
>
>SELECT
> MAX(Categories) AS Categories
> , MAX(Customers) AS Customers
> , MAX(Employees) AS Employees
> , MAX(Orders) AS Orders
>FROM (
> SELECT
> COUNT(*) AS Categories
> , 0 AS Customers
> , 0 AS Employees
> , 0 AS Orders
> FROM dbo.Categories
> UNION ALL
> SELECT
> 0
> , COUNT(*)
> , 0
> , 0
> FROM dbo.Customers
> UNION ALL
> SELECT
> 0
> , 0
> , COUNT(*)
> , 0
> FROM dbo.Employees
> UNION ALL
> SELECT
> 0
> , 0
> , 0
> , COUNT(*)
> FROM dbo.Orders
>) AS Q;
>
>/* Output:
>
>Categories Customers Employees Orders
>----------- ----------- ----------- -----------
>8 91 9 830
>
>(1 row(s) affected)
>
>*/

Ottimo, quoto!
>
>Ciao!
Grazie e ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5