SQL как получить общую сумму из всех строк продукта, не теряя каждую строку продукта из представления - PullRequest
0 голосов
/ 21 марта 2020

Мне нужно извлечь общую сумму всех строк из этого представления, если я сгруппирую по orderid, то функция суммы работает, но тогда я теряю каждую строку продукта из представления, и в этом случае я не хочу этого. Можно ли напечатать общую сумму (дублированную) для каждой строки?

Просмотр:

DROP VIEW IF EXISTS v_invoice;

CREATE VIEW v_invoice AS
SELECT
    f.id AS "Invoice nr",
    b.id AS "Order id",
    b.kundid AS "Customer id",
    p2o.produktid AS "Product id",
    p.namn AS "Name",
    p2o.antal AS "Number",
    p.pris AS "Price",
    (p2o.antal * p.pris) AS "Price per row",
    SUM(p2o.antal * p.pris) AS "Totalsum",
    b.skickad AS "Shipped",
    f.betald AS "Paid"
FROM
    faktura as f
    LEFT OUTER JOIN bestallning AS b ON f.orderid = b.id
    LEFT OUTER JOIN produkt2order AS p2o ON f.orderid = p2o.orderid
    LEFT OUTER JOIN produkt AS p ON p2o.produktid = p.produktid
GROUP BY
    p2o.produktid;

Печать таблицы:

MySQL [eshop]> SELECT * FROM v_invoice;
+------------+----------+-------------+------------+----------------------------+--------+-------+---------------+----------+---------------------+------------+
| Invoice nr | Order id | Customer id | Product id | Name                       | Number | Price | Price per row | Totalsum | Shipped             | Paid       |
+------------+----------+-------------+------------+----------------------------+--------+-------+---------------+----------+---------------------+------------+
|          1 |        1 |           1 | kaffe1     | Kaffemugg med dbwebb-tryck |      2 |    69 |           138 |      138 | 2020-03-20 19:41:05 | 2020-03-20 |
|          1 |        1 |           1 | te1        | Temugg med dbwebb-tryck    |      2 |    79 |           158 |      158 | 2020-03-20 19:41:05 | 2020-03-20 |
+------------+----------+-------------+------------+----------------------------+--------+-------+---------------+----------+---------------------+------------+
2 rows in set (0.001 sec)

1 Ответ

2 голосов
/ 21 марта 2020

Вы можете использовать модификатор WITH ROLLUP для GROUP BY, чтобы получить итоговую строку. Однако, поскольку у вас есть недопустимое предложение GROUP BY (не все неагрегированные столбцы содержатся в предложении GROUP BY), вы получите неопределенные значения для других столбцов в итоговой строке ROLLUP. Однако p2o.produktid будет NULL, так что вы можете использовать это для очистки других значений. Например:

CREATE VIEW v_invoice AS
SELECT
    IF(p2o.produktid IS NULL, NULL, f.id) AS "Invoice nr",
    IF(p2o.produktid IS NULL, NULL, b.id) AS "Order id",
    IF(p2o.produktid IS NULL, NULL, b.kundid) AS "Customer id",
    p2o.produktid AS "Product id",
    IF(p2o.produktid IS NULL, NULL, p.namn) AS "Name",
    IF(p2o.produktid IS NULL, NULL, p2o.antal) AS "Number",
    IF(p2o.produktid IS NULL, NULL, p.pris) AS "Price",
    IF(p2o.produktid IS NULL, NULL, (p2o.antal * p.pris)) AS "Price per row",
    SUM(p2o.antal * p.pris) AS "Totalsum",
    IF(p2o.produktid IS NULL, NULL, b.skickad) AS "Shipped",
    IF(p2o.produktid IS NULL, NULL, f.betald) AS "Paid"
FROM
    faktura as f
LEFT OUTER JOIN bestallning AS b ON f.orderid = b.id
LEFT OUTER JOIN produkt2order AS p2o ON f.orderid = p2o.orderid
LEFT OUTER JOIN produkt AS p ON p2o.produktid = p.produktid
GROUP BY
    p2o.produktid WITH ROLLUP;

Обратите внимание, что поскольку ваш GROUP BY не включает все неагрегированные столбцы, значения, которые вы видите в VIEW для этих столбцов, будут неопределенными, и может будет отличаться каждый раз, когда вы SELECT * FROM v_invoice.

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