SQL Server - объединение строк в представлении - PullRequest
0 голосов
/ 20 ноября 2018

Я создаю представление, которое должно показывать полную информацию о пицце по OrderID.Хотя, когда я запускаю свой вид, он печатает две строки для OrderID, потому что он имеет более одного топинга.Как можно объединить эти строки в моем представлении, чтобы обе начинки отображались в столбце «ToppingsDescription», а столбец «Общая цена» обновлялся (Large pizza = 15 долларов США и 0,30 доллара США за один продукт, так что обновленная цена должна быть 15.60 для большой идве начинки).Любые предложения о том, что делать?

CREATE VIEW PizzaPerOrder_vw
AS
SELECT PO.PizzaOrderID, PizzaSizeDesc, PizzaSpecialInstructions, ToppingsDescription, SUM(T.ToppingsPrice + PizzaSizePrice) AS 'Total Price'
FROM dbo.PizzaOrder AS PO
INNER JOIN dbo.Pizza AS P ON PO.PizzaOrderID = P.PizzaOrderID
INNER JOIN dbo.PizzaSpecialInstructions AS PI ON P.PizzaID = PI.PizzaID
INNER JOIN dbo.PizzaToppings AS PT ON P.PizzaID = PT.PizzaID
INNER JOIN dbo.Toppings AS T ON PT.ToppingsID = T.ToppingsID
INNER JOIN dbo.PizzaSize AS PS ON P.PizzaSizeID = PS.PizzaSizeID
GROUP BY PO.PizzaOrderID, PS.PizzaSizeDesc, PI.PizzaSpecialInstructions, T.ToppingsDescription;

enter image description here

1 Ответ

0 голосов
/ 20 ноября 2018

В SQL Server 2017 появилась новая агрегатная функция с именем STRING_AGG:

CREATE VIEW PizzaPerOrder_vw
AS
SELECT PO.PizzaOrderID, PizzaSizeDesc, PizzaSpecialInstructions, 
   STRING_AGG(ToppingsDescription, ',') AS Toppings,
   SUM(T.ToppingsPrice) + MAX(PizzaSizePrice) AS 'Total Price' 
FROM dbo.PizzaOrder AS PO
INNER JOIN dbo.Pizza AS P ON PO.PizzaOrderID = P.PizzaOrderID
INNER JOIN dbo.PizzaSpecialInstructions AS PI ON P.PizzaID = PI.PizzaID
INNER JOIN dbo.PizzaToppings AS PT ON P.PizzaID = PT.PizzaID
INNER JOIN dbo.Toppings AS T ON PT.ToppingsID = T.ToppingsID
INNER JOIN dbo.PizzaSize AS PS ON P.PizzaSizeID = PS.PizzaSizeID
GROUP BY PO.PizzaOrderID, PS.PizzaSizeDesc, PI.PizzaSpecialInstructions;

. Возвращает начинки в случайном порядке, если вам нужен определенный порядок:

STRING_AGG(ToppingsDescription, ',') WITHIN GROUP (ORDER BY ToppingsDescription) AS Toppings 

Возможно, было бы более эффективно агрегировать PizzaToppings до объединения с использованием CTE.

...