2011-09-28 4 views
1

J'ai un peu de sql qui regroupe des données pour le résumer.
C'est fondamentalement une liste de lieux, d'articles et de quantités.SQL Grouper, en combinant 2 lignes à une cellule

SELECT ItemCode, SUM(Qty) AS Qty 
FROM Putaway 
GROUP BY ItemCode 

Qui fonctionne comme prévu, en donnant un résumé des résultats.

ItemCode - Qty 
AAAA - 1 
BBBB - 2 
CCCC - 3 

Mais on m'a aussi demandé de donner une liste d'emplacements pour chacun des articles.

Donc, fondamentalement, je veux générer les résultats à être comme:

ItemCode - Qty - Locations 
AAAA  - 1 - A1 
BBBB  - 2 - B1, B2 
CCCC  - 3 - B5, B6, B7 

Si je fais l'évidence - et ajoutez [Localisation] au Groupe SELECT et par Puis son me donner 2 lignes pour BBBB Donc, puisqu'il y a plusieurs lignes pour chaque élément dans le tableau - comment puis-je le résumer et combiner les lignes [Emplacement] 's champ dans 1 champ. Je souhaite une solution SQL simple pour m'éviter d'avoir à écrire une sorte de page Web pour le faire.

J'espère que cela a du sens.

+0

Qu'est-ce que DB vous utilisez – Matthew

+0

Comme l'a dit @MatthewPK, quel est votre DB? Si vous êtes sur une instance récente de SQL Server, vous pouvez "tricher" et utiliser [PIVOT] (http://msdn.microsoft.com/en-us/library/ms177410.aspx) – Widor

+0

@Widor: No. la concaténation peut être utilisée 'SELECT ',' + Location FROM ... FOR XML PATH ('')'. –

Répondre

3

À condition que vous utilisez SQL Server 2005 ou plus récent, vous pouvez utiliser XML pour faire ce bit pour vous:

create table Putaway (
    ItemCode varchar(4), 
    Qty   int, 
    Location varchar(3) 
) 

insert into Putaway 
values ('AAAA', 1, 'A1'), 
    ('BBBB', 1, 'B1'), 
    ('BBBB', 1, 'B2'), 
    ('CCCC', 1, 'B5'), 
    ('CCCC', 1, 'B6'), 
    ('CCCC', 1, 'B7') 

SELECT ItemCode, SUM(Qty) AS Qty, 
    ( SELECT x.Location + ', ' 
     FROM Putaway x 
     WHERE p.ItemCode = x.ItemCode 
     ORDER BY x.Location 
     FOR XML PATH ('') 
    ) as Locations 
FROM Putaway p 
GROUP BY ItemCode 

Malheureusement, cela se traduit par une virgule supplémentaire à la fin, mais vous pouvez facilement couper dans votre interface graphique ou en faisant un sous-select.

+1

Juste pour le dossier, il y a une question semblable de previos (et réponse) sur SO: http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server-2005 – bfavaretto

+0

caca! a été battu à la réponse :) hehe – Christian

+0

Je pense qu'il y a probablement beaucoup de réponses similaires à cela sur SO - c'est un que je vois beaucoup demandé. –

2
SELECT p1.ItemCode, SUM(p1.Qty) AS Qty, (SELECT p2.location + ',' as 'data()' from putaway as p2 WHERE p1.itemcode LIKE p2.itemcode FOR xml path('')) AS Locations 
FROM Putaway as p1 
GROUP BY p1.itemcode; 
1

Cela aura pas une virgule supplémentaire à la fin

SELECT ItemCode, SUM(Qty) AS Qty, 
    Replace( (SELECT x.Location as [data()] 
     FROM Putaway x 
     WHERE p.ItemCode = x.ItemCode 
     ORDER BY x.Location 
     FOR XML PATH ('')) , ' ', ',') as Locations 
FROM Putaway p 
GROUP BY ItemCode 
Questions connexes