I have try couples of selection but I failed to get the exact answered I want to show. I wish to get ideas from here. Below is the last temp after I selected into.
| RID | LOTID | SAVID | QTY |
|---|---|---|---|
| A1278 | G926 | 87 | |
| A1278.1 | Y976 | D958-G | 108 |
| A1278 | T898 | 9 | |
| A1278.1 | K892 | D958-G | 32 |
| A1278.2 | B647 | D958-G | 47 |
| A1278.2 | H928 | D958-G | 89 |
What I want the output to be showed as below:
| RID | LOTID | SAVID | QTY |
|---|---|---|---|
| A1278.1 | Y976,K892 | D958-G | 140 |
| A1278.2 | B647,H928 | D958-G | 136 |
From the above output, I want to get the sum of qty when RID is same row and only calculate for those have SAVID and SAVID must meet the same for each RID so that they only can sum up. As you can see, since only the LOTID is uniquely, so it hardly make qty to be sum up when RID meet the same rows.
My question: is there any best way to query the above select statement?
The result is I want to select all with the sum of qty and list all LOTID as in the result table shown above.
Thanks!
CodePudding user response:
try something like this -
SELECT rid, lotid = STUFF(
(SELECT ',' lotid
FROM data_table t1
WHERE t1.rid = t2.rid
FOR XML PATH (''))
, 1, 1, '')
,t2.savid
,sum(t2.qty ) AS qty
FROM data_table t2
WHERE t2.savid <> ''
GROUP BY rid,t2.savid;
CodePudding user response:
You can just use STRING_AGG along with normal aggregation in newer versions of SQL Server
SELECT
t.RID,
LOTID = STRING_AGG(t.LOTID, ','),
t.SAVID,
QTY = SUM(t.QTY)
FROM data_table t
WHERE t.SAVID <> ''
GROUP BY
t.RID,
t.SAVID;
