'Regrouping groups in SQL Server
I am trying to solve the below problem, I have an existing dataset that is already grouped, but I need to it to be grouped further based on the common "SO_Number" in the dataset, example below:
Current Data:
Group_Key | SO_Number |
---|---|
233738 | SO21268046 |
233738 | SO21269767 |
234129 | SO21269767 |
234129 | SO21274404 |
234129 | SO21271542 |
234129 | SO21274421 |
234421 | SO21274421 |
234421 | SO21276633 |
234421 | SO21276877 |
88964 | SO21276877 |
88964 | SO21278203 |
88964 | SO21278329 |
234727 | SO21278329 |
234727 | SO21279199 |
234727 | SO21279542 |
91016 | SO21279542 |
91016 | SO21289940 |
88111 | SO21289664 |
88111 | SO21289665 |
88112 | SO21289665 |
88112 | SO21289677 |
88113 | SO21289678 |
Expected Data output:
NewGroup_Key | Group_key | SO_number |
---|---|---|
233738,234129,234421,88964,234727,91016 | 233738 | SO21268046 |
233738,234129,234421,88964,234727,91016 | 233738 | SO21269767 |
233738,234129,234421,88964,234727,91016 | 234129 | SO21269767 |
233738,234129,234421,88964,234727,91016 | 234129 | SO21274404 |
233738,234129,234421,88964,234727,91016 | 234129 | SO21271542 |
233738,234129,234421,88964,234727,91016 | 234129 | SO21274421 |
233738,234129,234421,88964,234727,91016 | 234421 | SO21274421 |
233738,234129,234421,88964,234727,91016 | 234421 | SO21276633 |
233738,234129,234421,88964,234727,91016 | 234421 | SO21276877 |
233738,234129,234421,88964,234727,91016 | 88964 | SO21276877 |
233738,234129,234421,88964,234727,91016 | 88964 | SO21278203 |
233738,234129,234421,88964,234727,91016 | 88964 | SO21278329 |
233738,234129,234421,88964,234727,91016 | 234727 | SO21278329 |
233738,234129,234421,88964,234727,91016 | 234727 | SO21279199 |
233738,234129,234421,88964,234727,91016 | 234727 | SO21279542 |
233738,234129,234421,88964,234727,91016 | 91016 | SO21279542 |
233738,234129,234421,88964,234727,91016 | 91016 | SO21289940 |
88111,88112 | 88111 | SO21289665 |
88111,88112 | 88112 | SO21289677 |
88113 | 88113 | SO21289678 |
The expected data output I need should be in three groups instead of nine groups as they're all grouped by SO_Number - hence creating a new group key (NewGroup_Key) that will be used for new mapping of the data. Note that this is just a subset of the dataset so there are other groups that are involved as well. I have bolded the SO_number where each of the groups should be linked(grouped) in the "Current Data" table.
I have tried a few queries my end but didn't lead to anything reasonable or easy to follow using SQL. So any ideas would be helpful.
Solution 1:[1]
Hen you say 'clustering' are you referring to this?
declare @t TABLE (
category int NOT NULL
,segment NVARCHAR(50) NOT NULL
,payment int NOT NULL
);
INSERT INTO @t(category,segment,payment) VALUES (01,'A',1425);
INSERT INTO @t(category,segment,payment) VALUES (01,'B',7647);
INSERT INTO @t(category,segment,payment) VALUES (01,'A',6164);
INSERT INTO @t(category,segment,payment) VALUES (01,'B',3241);
--if you want payment column as string then use following
SELECT
category,
segment,
STRING_AGG(cast(payment as nvarchar(50)),'+') payment
FROM
@t T
GROUP BY
category,segment
Result:
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | ASH |