SQL - объединение нескольких записей в одну запись - PullRequest
2 голосов
/ 02 апреля 2010

У меня есть база данных SQL Server со следующими таблицами:

Клиент (ClientID, ClientName)

SalesAgent (AgentID, AgentName)

Item (ItemID, Description)

Покупка (идентификатор покупки, идентификатор клиента, идентификатор товара, цена)

PurchaseSalesAgent (PurchaseID, AgentID)

Каждая покупка - это когда-либо только один предмет одному клиенту, но может быть задействовано несколько агентов. Я хочу вернуть следующий список столбцов:

ClientName, описание, цена, агенты

Где Агенты - это имена всех агентов, участвующих в покупке. В виде списка через запятую или нескольких столбцов с одним агентом в каждом.

Я ищу способ, совместимый с SQL Server 2000, но мне также было бы интересно узнать, есть ли лучший способ сделать это в SQL Server 2008.

Ответы [ 2 ]

1 голос
/ 02 апреля 2010

Используя Sql Server 2008, вы можете попробовать

DECLARE @Client TABLE (ClientID INT, ClientName VARCHAR(10))

DECLARE @SalesAgent TABLE (AgentID INT, AgentName VARCHAR(10))

DECLARE @Item TABLE (ItemID INT, Description VARCHAR(10))

DECLARE @Purchase TABLE (PurchaseID INT , ClientID INT, ItemID INT, Price FLOAT)

DECLARE @PurchaseSalesAgent TABLE (PurchaseID INT, AgentID INT)


SELECT  c.ClientName,
        i.Description, 
        p.Price     ,
        (
            SELECT  sa.AgentName + ','
            FROM    @SalesAgent sa
            WHERE   sa.AgentID = pa.AgentID
            FOR XML PATH('')
        ) Agents
FROm    @Client c INNER JOIN
        @Purchase p ON c.ClientID = p.ClientID INNER JOIN
        @PurchaseSalesAgent pa ON p.PurchaseID = pa.PurchaseID INNER JOIN
        @Item i ON p.ItemID = i.ItemID

EDIT

Я сделал предположение, что Покупка TABLE имеет столбец ItemID INT для ссылки на Предметы TABLE

1 голос
/ 02 апреля 2010

В SQL 2008 вы должны использовать FOR XML PATH ('') ... что-то вроде:

select c.clientname, i.description, p.price, 
   stuff((select ', ' + a.AgentName 
    from SalesAgent sa join PurchaseSalesAgent psa on psa.AgentID = sa.AgentID
    where psa.PurchaseID = p.purchaseID
    for xml path('')),1,2,'') as Agents
from client c 
join purchase p on p.clientid = c.clientid
join item i on i.itemid = p.itemid
;

В SQL 2000 нет приятного способа сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...