salve,
devi effettuare una "rotazione" di riga su colonna, e si puo' fare in svariati modi...
ti elenco la forma piu' semplice, effettuata via SUM( CASE WHEN colonna=filtro THEN 1 ELSE 0 END), che e' la modialita' piu' tradizionale e semplice da gestire..
di seguito una doppia aggregazione con filtro di ricerca per i 2 possibili valori e JOIN dei risultati, ed infine la "classica" metodologia di PIVOTing fornita da SQL Server... personalmente non ho mai amato l'ultima e preferisco la prima, ma vedi tu...
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Tipologia (
Id int NOT NULL PRIMARY KEY,
Descrizione varchar(25) NOT NULL
);
CREATE TABLE dbo.ElencoPrenotazioni (
Id int PRIMARY KEY IDENTITY,
IdTipo int NOT NULL
CONSTRAINT fk_ElencoPrenotazioni$has$Tipologia
FOREIGN KEY REFERENCES dbo.Tipologia(id),
ClientePerso bit NOT NULL
)
GO
INSERT INTO dbo.Tipologia
VALUES (1, 'BOLLETTINI'), (2, 'CORRISPONDENZA E PACCHI'), (3, 'IMPRESA')
, (4, 'Tutti Buoni'), (5, 'Solo Persi');
DECLARE @Loop int = 1;
WHILE @Loop <=100 BEGIN
DECLARE @Perso bit = 0;
IF @Loop % 3 = 0 SET @Perso = 1;
INSERT INTO dbo.ElencoPrenotazioni (IdTipo, ClientePerso)
VALUES ( 1, @Perso );
SET @Perso = 0;
IF @Loop % 5 = 0 SET @Perso = 1;
INSERT INTO dbo.ElencoPrenotazioni (IdTipo, ClientePerso)
VALUES ( 2, @Perso );
SET @Perso = 0;
IF @Loop % 7 = 0 SET @Perso = 1;
INSERT INTO dbo.ElencoPrenotazioni (IdTipo, ClientePerso)
VALUES ( 3, @Perso );
SET @Loop +=1;
END;
INSERT INTO dbo.ElencoPrenotazioni (IdTipo, ClientePerso)
VALUES ( 4, 0 );
INSERT INTO dbo.ElencoPrenotazioni (IdTipo, ClientePerso)
VALUES ( 5, 1 );
GO
--SELECT *
-- FROM dbo.ElencoPrenotazioni e
-- JOIN dbo.Tipologia t ON e.[IdTipo] = t.[Id];
SELECT t.[Descrizione], e.[ClientePerso], COUNT(*) AS [Conto]
FROM dbo.ElencoPrenotazioni e
JOIN dbo.Tipologia t ON e.[IdTipo] = t.[Id]
GROUP BY t.[Descrizione], e.[ClientePerso];
PRINT 'Raggruppamento via Validita'' con aggregazione condizionata';
SELECT t.[Descrizione]
, SUM( CASE WHEN e.[ClientePerso] = 0 THEN 1 ELSE 0 END ) AS [ContoBuono]
, SUM( CASE WHEN e.[ClientePerso] = 1 THEN 1 ELSE 0 END ) AS [Persi]
FROM dbo.ElencoPrenotazioni e
JOIN dbo.Tipologia t ON e.[IdTipo] = t.[Id]
GROUP BY t.[Descrizione];
PRINT '--';
PRINT 'Raggruppamento via aggregazione partizionata e JOIN dei risultati';
WITH cte1 AS (
SELECT t.[Descrizione], e.[ClientePerso], COUNT(*) AS [Conto]
FROM dbo.ElencoPrenotazioni e
JOIN dbo.Tipologia t ON e.[IdTipo] = t.[Id]
WHERE e.[ClientePerso] = 0
GROUP BY t.[Descrizione], e.[ClientePerso]
),
cte2 AS (
SELECT t.[Descrizione], e.[ClientePerso], COUNT(*) AS [Conto]
FROM dbo.ElencoPrenotazioni e
JOIN dbo.Tipologia t ON e.[IdTipo] = t.[Id]
WHERE e.[ClientePerso] = 1
GROUP BY t.[Descrizione], e.[ClientePerso]
)
-- sostituito con FULL OUTER JOIN
SELECT ISNULL(c1.[Descrizione], c2.[Descrizione]) AS [Descrizione]
, ISNULL(c1.[Conto], 0) AS [ContoBuono]
, ISNULL(c2.[Conto], 0) AS [Persi]
FROM cte1 c1
FULL OUTER JOIN cte2 c2 ON c1.[Descrizione] = c2.[Descrizione];
-- sostituito con FULL OUTER JOIN per
-- evitare la perdita di righe causa
-- evenutale mancanza di correlazione
--SELECT c1.[Descrizione], c1.[Conto] AS [ContoBuono], c2.[Conto] AS [Persi]
-- FROM cte1 c1
-- JOIN cte2 c2 ON c1.[Descrizione] = c2.[Descrizione];
PRINT '--';
PRINT 'Raggruppamento via PIVOTing';
SELECT [Descrizione], [0] AS [ContoBuono], [1] AS [Persi]
FROM
(SELECT t.[Descrizione], e.[ClientePerso]
FROM dbo.ElencoPrenotazioni e
JOIN dbo.Tipologia t ON e.[IdTipo] = t.[Id]
) AS SourceTable
PIVOT
(COUNT([ClientePerso]) FOR [ClientePerso] IN ([0],[1])) AS PivotTable;
GO
DROP TABLE dbo.ElencoPrenotazioni, dbo.Tipologia;
--<----------
Descrizione ClientePerso Conto
------------------------- ------------ -----------
BOLLETTINI 0 67
CORRISPONDENZA E PACCHI 0 80
IMPRESA 0 86
Tutti Buoni 0 1
BOLLETTINI 1 33
CORRISPONDENZA E PACCHI 1 20
IMPRESA 1 14
Solo Persi 1 1
Raggruppamento via Validita' con aggregazione condizionata
Descrizione ContoBuono Persi
------------------------- ----------- -----------
BOLLETTINI 67 33
CORRISPONDENZA E PACCHI 80 20
IMPRESA 86 14
Solo Persi 0 1
Tutti Buoni 1 0
--
Raggruppamento via aggregazione partizionata e JOIN dei risultati
Descrizione ContoBuono Persi
------------------------- ----------- -----------
BOLLETTINI 67 33
CORRISPONDENZA E PACCHI 80 20
IMPRESA 86 14
Tutti Buoni 1 0
Solo Persi 0 1
--
Raggruppamento via PIVOTing
Descrizione ContoBuono Persi
------------------------- ----------- -----------
BOLLETTINI 67 33
CORRISPONDENZA E PACCHI 80 20
IMPRESA 86 14
Solo Persi 0 1
Tutti Buoni 1 0
saluti
Modificato da Andrea Montanari il 18 dicembre 2015 13.47 - modificata la JOIN con FULL OUTER JOIN per evitare la perdita di righe causa evenutale mancanza di correlazione