Reputation: 63
I am having a large table with a basic structure like :
Aircode FlightNumber Locator Title
A01 F01 A Miss
A01 F01 A Mr
A01 F01 B Miss
A01 F01 B Miss
A01 F02 A Mr
A01 F02 A Mr
A01 F02 C Mr
A02 F01 A Mr
I wonder if it is possible to create a query and returns the group names only once in MSSQL , such as :
Aircode FlightNumber Locator Title
A01 F01 A Miss
Mr
B Miss
Miss
F02 A Mr
Mr
C Mr
A02 F01 A Mr
After the some search I found method using Row_Number() Over (Partition by) , but I get very confused in this case with multiple groups as I can't think of way to hide multiple values from multiple columns. I wonder if there is a proper way of proceeding this piece of data.
EDIT 1 By applied CTE and ROW_NUMBER method , it returns blank records with no values first , then Title , Locator etc. Example:
Aircode FlightNumber Locator Title
Miss
Miss
A Mr
A01 F01 B Miss
A02 F02 B Miss
Upvotes: 2
Views: 1556
Reputation: 11983
Try assigning a ROW_NUMBER
to each partition level and only show the text for the first one:
WITH cte AS (
SELECT
[Aircode]
,[FlightNumber]
,[Locator]
,[Title]
,[r1] = ROW_NUMBER()
OVER(PARTITION BY [Aircode]
ORDER BY [AirCode])
,[r2] = ROW_NUMBER()
OVER(PARTITION BY [Aircode], [FlightNumber]
ORDER BY [FlightNumber])
,[r3] = ROW_NUMBER()
OVER(PARTITION BY [Aircode], [FlightNumber], [Locator]
ORDER BY [Locator])
FROM <table>
)
SELECT [Aircode] = CASE WHEN [r1] = 1 THEN [Aircode] ELSE '' END
,[FlightNumber] = CASE WHEN [r2] = 1 THEN [FlightNumber] ELSE '' END
,[Locator] = CASE WHEN [r3] = 1 THEN [Locator] ELSE '' END
,[Title]
FROM cte
ORDER BY cte.[Aircode], cte.[FlightNumber], cte.[Locator], cte.[Title]
Upvotes: 5