SQL Grouping, объединяющий 2 строки в одну ячейку - PullRequest
1 голос
/ 28 сентября 2011

У меня есть некоторые sql, которые группируют данные, чтобы суммировать их.
Это в основном список мест, предметов и количества.

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

Что работает, как и ожидалось, с обобщением результатов.

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

Но меня попросили дать список мест для каждого из предметов.

Так что, в принципе, я хочу, чтобы результаты были похожи на:

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

Если я сделаю очевидное - и просто добавлю [Местоположение] в SELECT и сгруппирую по Затем он дает мне 2 строки для BBBB, 3 для CCCC и т. Д. (Именно так, как и должно быть, но не так, как я хочу)

Итак, поскольку для каждого элемента в таблице имеется несколько строк - как я могу суммировать его и объединить поле строк [Местоположение] в 1 поле.

Я надеюсь на простое решение SQL, чтобы мне не пришлось писать какую-то веб-страницу для этого.

Надеюсь, это имеет смысл.

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

При условии, что вы используете SQL Server 2005 или новее, вы можете использовать FOR XML, чтобы сделать этот бит для вас:

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

К сожалению, это приводит к дополнительной запятой в конце, но выможет легко обрезать это в вашем графическом интерфейсе или сделать его вторым.

2 голосов
/ 16 августа 2013

В конце не будет лишней запятой

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
2 голосов
/ 28 сентября 2011
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...