Могу ли я объединить ТОЛЬКО один столбец в большем запросе SQL ИЛИ перенести несколько строк в дополнительные столбцы? - PullRequest
2 голосов
/ 17 января 2020

Это веб-приложение поставщика, которое пытается сгенерировать информацию, чтобы поместить ее в электронное письмо и отправить ее.

Я видел похожие ответы, в которых используется FOR XML PATH, но в которых собрана вся доходность в одну строку, где мне нужно одну строку на элемент. Я также видел ответы, которые используют подзапросы, но в данном случае это не работает.

У меня есть 2 таблицы; OrderItem OI, в котором перечислены все когда-либо заказанные товары, OrderItemProperties OIP, в котором перечислены все параметры, которые любой клиент сделал для всех товаров (от 5 до 6 для каждого товара). Ни одно из свойств никоим образом не идентифицируется по типу свойства, в таблице просто перечислены [ItemID, PropUID, PropValue], где PropUID - просто последовательные числа.

Пока что у меня есть:

SELECT OI.ItemID, OI.TotalPrice, OIP.PropValue
FROM OrderItemProperties OIP
JOIN OrderItem OI ON OI.ItemID = OIP.ItemID
WHERE OI.OrderID = 12345
AND (OIP.PropValue IN ('MSNISA', 'KHNISA') OR OIP.PropValue LIKE '<DateTime>%')

К сожалению, единственным параметром, который программа передает в запрос, является OI.OrderID. Это должно сгенерировать строку для каждого элемента в заказе клиентов, который затем передается в xlst документ с использованием <xsl:for-each select..>, но (очевидно!) Я получаю

ItemID | TotalPrice | PropValue
555    | 9.99       | MSNISA
555    | 9.99       | <DateTime><Server>17/01/2020...
556    | 19.50      | KHNISA
556    | 19.50      | <DateTime><Server>18/01/2020...

Что я пытаюсь сделать получить это:

ItemID | TotalPrice | PropValue
555    | 9.99       | MSNISA, <DateTime><Server>17/01/2020...
556    | 19.50      | KHNISA, <DateTime><Server>18/01/2020...

Или, что было бы еще лучше:

ItemID | TotalPrice | PropValue[1] | PropValue[2]
555    | 9.99       | MSNISA       | <DateTime><Server>17/01/2020...
556    | 19.50      | KHNISA       | <DateTime><Server>18/01/2020...

Приложение, которое я использую, имеет только ограниченное количество параметров, которые оно передает в запрос, но оно позволяет создавать и объявлять переменные в запросе.

Любая помощь приветствуется, так как я просто соединяю все вместе, как я go на данный момент!

Ответы [ 3 ]

1 голос
/ 17 января 2020

Я думаю, что агрегация делает то, что вы хотите:

SELECT OI.ItemID, OI.TotalPrice,
       MIN(OIP.PropValue), MAX(OIP.PropValue)
FROM OrderItemProperties OIP JOIN
     OrderItem OI
     ON OI.ItemID = OIP.ItemID
WHERE OI.OrderID = 12345 AND
      (OIP.PropValue IN ('MSNISA', 'KHNISA') OR OIP.PropValue LIKE '<DateTime>%')
GROUP BY OI.ItemID, OI.TotalPrice;
1 голос
/ 17 января 2020

Я полагаю, что вы могли бы использовать команду STUFF (), как вы изначально предполагали. У меня нет примеров данных для проверки, могут быть небольшие проблемы с синтаксисом. SQLFiddle .

-- Casts XML back to varchar
SELECT    [oi].[itemid]
        , MAX([oi].[totalprice]) AS          "totalprice"
        , STUFF(
(
    SELECT ',' + [oip].[propvalue]
    FROM    [orderitemproperties] AS [oip]
    WHERE  [oip].[itemid] = [oi].[itemid] FOR XML PATH(''), TYPE
).value
       ( '.', 'varchar(max)' ), 1, 1, '') AS "propvalue"
FROM orderitem AS oi
GROUP BY [oi].[itemid];
-- ORIGINAL QUERY - experiences issues with xml to varchar formatting
SELECT    [oi].[itemid]
        , MAX([oi].[totalprice]) as "TotalPrice"
        , STUFF(
(
    SELECT ',' + [oip].[propvalue]
    FROM    [orderitemproperties] AS [oip]
    WHERE  [oip].[itemid] = [oi].[itemid] FOR XML PATH('')
), 1, 1, '') as "PropValue"
FROM orderitem AS oi
GROUP BY [oi].[itemid];
0 голосов
/ 17 января 2020

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

SELECT [ItemID] = OI.ItemID, [TotalPrice] = OI.TotalPrice, [PropValue1] = OIP1.PropValue, [PropValue2] = OIP2.PropValue
FROM OrderItem OI
JOIN OrderItemProperties OIP1 on OIP1.ItemID = OI.ItemID AND OIP1.PropValue = 'MSNISA'
JOIN OrderItemProperties OIP2 on OIP2.ItemID = OI.ItemID AND OIP2.Propvalue like '<DateTime>%'
WHERE OI.OrderID = 12345
UNION
    SELECT [ItemID] = OI.ItemID, [TotalPrice] = OI.TotalPrice, [PropValue1] = OIP1.PropValue, [PropValue2] = OIP2.PropValue
FROM OrderItem OI
JOIN OrderItemProperties OIP1 on OIP1.ItemID = OI.ItemID AND OIP1.PropValue = 'KHNISA'
JOIN OrderItemProperties OIP2 on OIP2.ItemID = OI.ItemID AND OIP2.Propvalue like '<DateTime>%'
WHERE OI.OrderID = 12345
...