I know this topic is everywhere but I couldn\'t get it to work properly. It\'s probably something very simple.
Here is a sample of the data after a basic query:
Give this a shot...
IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL
DROP TABLE #TestData;
CREATE TABLE #TestData (
[Site] CHAR(3) NOT NULL,
Model VARCHAR(30) NOT NULL,
SomeCount INT NOT NULL DEFAULT(0)
);
INSERT #TestData (Site, Model, SomeCount) VALUES
('AAA', 'ProLiant DL380 G7', 1),
('AAA', 'OptiPlex 790', 500),
('BBB', 'OptiPlex 780', 80),
('CCC', 'OptiPlex 790', 23);
--==========================================================
DECLARE
@PivotColumns NVARCHAR(4000),
@sql NVARCHAR(4000),
@DeBug BIT = 0;
SELECT
@PivotColumns = CONCAT(@PivotColumns, N',
', QUOTENAME(td.Model), N' = SUM(CASE WHEN td.Model = ', QUOTENAME(td.Model, ''''), N' THEN td.SomeCount END)')
FROM
#TestData td
GROUP BY
td.Model
-- ORDER BY ??? if you want the columns in a specific ordinal position.
;
SET @sql = CONCAT(N'
SELECT
td.[Site]',
@PivotColumns, N'
FROM
#TestData td
GROUP BY
td.[Site];');
IF @DeBug = 1
BEGIN
PRINT (@sql);
END;
ELSE
BEGIN
EXEC sys.sp_executesql @sql;
END;
Results...
Site OptiPlex 780 OptiPlex 790 ProLiant DL380 G7
---- ------------ ------------ -----------------
AAA NULL 500 1
BBB 80 NULL NULL
CCC NULL 23 NULL