Labels

admin (1) aix (1) alert (1) always-on (2) Architecture (1) aws (3) Azure (1) backup (3) BI-DWH (10) Binary (3) Boolean (1) C# (1) cache (1) casting (3) cdc (1) certificate (1) checks (1) cloud (3) cluster (1) cmd (7) collation (1) columns (1) compilation (1) configurations (7) Connection-String (2) connections (6) constraint (6) copypaste (2) cpu (2) csv (3) CTE (1) data-types (1) datetime (23) db (547) DB2 (1) deadlock (2) Denali (7) device (6) dotNet (5) dynamicSQL (11) email (5) encoding (1) encryption (4) errors (124) excel (1) ExecutionPlan (10) extended events (1) files (7) FIPS (1) foreign key (1) fragmentation (1) functions (1) GCP (2) gMSA (2) google (2) HADR (1) hashing (3) in-memory (1) index (3) indexedViews (2) insert (3) install (10) IO (1) isql (6) javascript (1) jobs (11) join (2) LDAP (2) LinkedServers (8) Linux (15) log (6) login (1) maintenance (3) mariadb (1) memory (4) merge (3) monitoring (4) MSA (2) mssql (444) mssql2005 (5) mssql2008R2 (20) mssql2012 (2) mysql (36) MySQL Shell (5) network (1) NoSQL (1) null (2) numeric (9) object-oriented (1) offline (1) openssl (1) Operating System (4) oracle (7) ORDBMS (1) ordering (2) Outer Apply (1) Outlook (1) page (1) parameters (2) partition (1) password (1) Performance (103) permissions (10) pivot (3) PLE (1) port (4) PostgreSQL (14) profiler (1) RDS (3) read (1) Replication (12) restore (4) root (1) RPO (1) RTO (1) SAP ASE (48) SAP RS (20) SCC (4) scema (1) script (8) security (10) segment (1) server (1) service broker (2) services (4) settings (75) SQL (74) SSAS (1) SSIS (19) SSL (8) SSMS (4) SSRS (6) storage (1) String (35) sybase (57) telnet (2) tempdb (1) Theory (2) tips (120) tools (3) training (1) transaction (6) trigger (2) Tuple (2) TVP (1) unix (8) users (3) vb.net (4) versioning (1) windows (14) xml (10) XSD (1) zip (1)
Showing posts with label pivot. Show all posts
Showing posts with label pivot. Show all posts

Pivot Table With Multiple Column Aggregates

CREATE TABLE #DoublePivot
(      [ID] INT IDENTITY(1,1) NOT NULL,
       [UserID] INT NOT NULL,
       [SomeType] INT NOT NULL,
       [NumberA] INT NOT NULL,
       [NumberB] INT NOT NULL,
       [Created] DATETIME NOT NULL DEFAULT(getdate())
)

INSERT INTO #DoublePivot
       (      UserID, SomeType, NumberA, NumberB )
       VALUES
       (      1, 1, 20, 10 ),
       (      1, 2, 50, 20 ),
       (      1, 1, 10, 0),
       (      2, 1, 10, 10),
       (      2, 2, 10, 40),
       (      1, 1, 20, 20),
       (      2, 2, 20, 70);

SELECT * FROM #DoublePivot order by UserID, SomeType

SELECT UserID, SomeType, SUM(NumberA) as SumNumberA, SUM(NumberB) as SumNumberB FROM #DoublePivot Group by UserID, SomeType order by UserID, SomeType
                                 
       SELECT UserID,
                     MAX([1]) AS SomeType1_NumberA,
                     MAX([-1]) AS SomeType1_NumberB,
                     MAX([2]) AS SomeType1_NumberB ,
                     MAX([-2]) AS SomeType2_NumberB
       FROM
                     (      SELECT UserID,
                                         SomeType,
                                         (-* SomeType) as SomeTypeB,
                                         SUM(NumberA) AS NumberA,
                                         SUM(NumberB) AS NumberB
                           FROM #DoublePivot
                           GROUP BY UserID, SomeType
                     )  BaseTable
                     PIVOT
                     (      SUM(NumberA)
                           FOR SomeType IN ([1], [2])
                     ) AS PivotA
                     PIVOT
                     (      SUM(NumberB)
                           FOR SomeTypeB IN ([-1], [-2])
                     ) AS PivotB
       GROUP BY UserID

DROP TABLE #DoublePivot

*  (-1 * SomeType) - in order to set a new "base" column to the second pivot summary.



Pivot On Multiple Columns

------------------------------------------------------------------------------
-- temp table for the example
CREATE TABLE tmpResults
( CustomerType nvarchar(50),
SomeTypeLetter nvarchar(50),
NumOfCustomers int
)

INSERT INTO tmpResults (CustomerType, SomeTypeLetter, NumOfCustomers)
VALUES ('CustomerType1', 'SomeTypeA', 33),
('CustomerType1', 'SomeTypeB', 12),
('CustomerType1', 'SomeTypeC', 61),
('CustomerType2', 'SomeTypeA', 11),
('CustomerType2', 'SomeTypeB', 25),
('CustomerType2', 'SomeTypeC', 21),
('CustomerType3', 'SomeTypeA', 17),
('CustomerType3', 'SomeTypeB', 38),
('CustomerType3', 'SomeTypeC', 9),
('CustomerType4', 'SomeTypeA', 5),
('CustomerType4', 'SomeTypeB', 91),
('CustomerType4', 'SomeTypeC', 12)

--SELECT * FROM tmpResults

------------------------------------------------------------------------------

--Pivot On Multiple Columns:
SELECT [CustomerType1-SomeTypeA], [CustomerType1-SomeTypeB], [CustomerType1-SomeTypeC],
[CustomerType2-SomeTypeA], [CustomerType2-SomeTypeB], [CustomerType2-SomeTypeC],
[CustomerType3-SomeTypeA], [CustomerType3-SomeTypeB], [CustomerType3-SomeTypeC],
[CustomerType4-SomeTypeA], [CustomerType4-SomeTypeB], [CustomerType4-SomeTypeC]
FROM 
(   SELECT  isnull(p.NumOfCustomers,0) as NumOfCustomers,
(p.CustomerType) + '-' + (p.SomeTypeLetter) as [desc]
FROM    tmpResults p
) [base]
PIVOT
(   SUM(NumOfCustomers)
FOR [desc] IN
(
[CustomerType1-SomeTypeA], [CustomerType1-SomeTypeB], [CustomerType1-SomeTypeC],
[CustomerType2-SomeTypeA], [CustomerType2-SomeTypeB], [CustomerType2-SomeTypeC],
[CustomerType3-SomeTypeA], [CustomerType3-SomeTypeB], [CustomerType3-SomeTypeC],
[CustomerType4-SomeTypeA], [CustomerType4-SomeTypeB], [CustomerType4-SomeTypeC]
)
) [pvt]

DROP TABLE tmpResults


PIVOT

PIVOT rotates a table-valued expression by turning the unique values from one column in the expression into multiple columns in the output.


SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4]
FROM
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) SourceTable
PIVOT
(
AVG(StandardCost)
FOR DaysToManufacture IN ([0], [1], [2], [3], [4])
) PivotTable

Notes:
  • Available from SQL Server 2005.
  • When aggregate functions are used with PIVOT, the presence of any null values in the value column are not considered when computing an aggregation.
  • Pivot columns are specific values from the column of the source table, and can't be declared dynamic.