I've data as follows
| AreaId | AreaName | Module |
|---|---|---|
| 1 | AAA | Square |
| 2 | AAA | Circle |
| 3 | BBB | Square |
| 4 | CCC | Square |
| 5 | CCC | Circle |
| 6 | DDD | Circle |
I'm looking for some help in SQL to get the data as follows
| AreaName | SquareArea | CircleArea |
|---|---|---|
| AAA | 1 | 2 |
| BBB | 3 | Null |
| CCC | 4 | 5 |
| DDD | Null | 6 |
I've tried with Distinct. But I'm unable to prepare the SQL for the data result that I'm looking for
CodePudding user response:
DECLARE @table TABLE (AreaID INT IDENTITY, AreaName NVARCHAR(3), Module NVARCHAR(10))
INSERT INTO @table (AreaName, Module) VALUES
('AAA','Square'),('AAA','Circle'),('BBB','Square'),
('CCC','Square'),('CCC','Circle'),('DDD','Circle')
Example data is much easier to use when it's presented as a defined object.
SELECT AreaName, AVG(CASE WHEN Module = 'Square' THEN AreaID END) AS SquareArea,
AVG(CASE WHEN Module = 'Circle' THEN AreaID END) AS CircleArea
FROM @table t
GROUP BY t.AreaName
You will need to decide which aggregation method you want to use though, MIN? MAX? AVG?
CodePudding user response:
This is a standard pivot.
SELECT AreaName, SquareArea = [Square], CircleArea = [Circle]
FROM dbo.YourTableName
PIVOT (MAX(AreaID) FOR Module IN ([Square],[Circle])) AS p;
Working example in this fiddle.
