如何组合聚合函数 Sum() 和 Max()

How to combine aggregate function Sum() and Max()

我正在编写一份报告,以编译来自 ORDERSORDERS_ITEMS 的一些结果,尝试在 MAX.

中使用 SUM

请问有更好的方法得到结果吗?也许关键是使用子查询,但我无法实现正确的方法。

这是我的简单代码(http://sqlfiddle.com/#!18/5c3b88/3):

CREATE TABLE ORDERS (
    ID int NOT NULL,
    DATE datetime NULL,
    TOTAL_VALUE float(8) NOT NULL,
    PRIMARY KEY (ID)
);

INSERT INTO ORDERS (ID, DATE, TOTAL_VALUE) VALUES
(245, '2020-11-23 10:37:28.467' , 1848.06),
(246, '2020-11-23 12:06:07.157' , 281.45),
(247, '2020-11-23 12:06:49.250' , 84.06),
(248, '2020-11-23 14:45:58.347' , 59.8);

CREATE TABLE ORDERS_ITEMS (
    ITEM_ID int NOT NULL,
    ID int NOT NULL,
    QUANTITY float(8) NOT NULL,
    PRIMARY KEY (ITEM_ID)
);

INSERT INTO ORDERS_ITEMS (ITEM_ID, ID, QUANTITY) VALUES
(1 , 245 , 10),
(2 , 245 , 3),
(3 , 245 , 8),
(4 , 245 , 4),
(5 , 245 , 50),
(6 , 246 , 5),
(7 , 247 , 1),
(8 , 248 , 2);

这个:

SELECT O.ID, O.DATE, O.TOTAL_VALUE, OI.QUANTITY
FROM ORDERS O
INNER JOIN ORDERS_ITEMS OI ON O.ID = OI.ID
WHERE O.DATE >= (GetDate() - 90); -- SELECT last 90 days

Returns 这个:

ID  | DATE                    | TOTAL_VALUE | QUANTITY |
245 | 2020-11-23 10:37:28.467 | 1848.06     | 10       |
245 | 2020-11-23 10:37:28.467 | 1848.06     | 3        |
245 | 2020-11-23 10:37:28.467 | 1848.06     | 8        |
245 | 2020-11-23 10:37:28.467 | 1848.06     | 4        |
245 | 2020-11-23 10:37:28.467 | 1848.06     | 50       |
246 | 2020-11-23 12:06:07.157 | 281.45      | 5        |
247 | 2020-11-23 12:06:49.250 | 84.06       | 1        |
248 | 2020-11-23 14:45:58.347 | 59.8        | 2        |

而这并没有给出真正的结果 ( 2273.37 ) 来自 O.TOTAL_VALUE:

SELECT
Max(O.ID), Max(O.DATE), Max(O.TOTAL_VALUE), Sum(OI.QUANTITY)
FROM ORDERS O
INNER JOIN ORDERS_ITEMS OI ON O.ID = OI.ID
WHERE O.DATE >= (GetDate() - 90) -- SELECT last 90 days
GROUP BY O.ID;

你能帮我实现这个结果吗?

ID  | DATE                    | TOTAL_VALUE    | QUANTITY |
248 | 2020-11-23 14:45:58.347 | 2273.37        | 83       |

我想你想要 ORDER BYTOP:

SELECT TOP (1) O.ID, O.DATE, O.TOTAL_VALUE, OI.QUANTITY
FROM ORDERS O INNER JOIN
     ORDERS_ITEMS OI
     ON O.ID = OI.ID
WHERE O.DATE >= (GetDate() - 90) -- SELECT last 90 days
ORDER BY o.DATE DESC;

如果您想要多行(如果有并列),您可以使用 TOP (1) WITH TIES

我看到您正在尝试获取所有订单的总和,而不是单个订单。 在那种情况下,为什么在最终输出中需要订单 ID 和日期?

以下查询是您要查询的内容。

    SELECT (select max(ID) from ORDERS) as ID,
       (select max(DATE) from ORDERS) as DATE,
       SUM(TOTAL_VALUE),
       SUM(QUANTITY)
FROM (
SELECT distinct O.ID
              , O.DATE
              , max (O.TOTAL_VALUE) TOTAL_VALUE
              , SUM (OI.QUANTITY ) over(partition by O.ID) QUANTITY
FROM ORDERS O
INNER JOIN ORDERS_ITEMS OI ON O.ID = OI.ID
WHERE O.DATE >= (GetDate() - 90) -- SELECT last 90 days
group by O.ID,OI.QUANTITY,O.DATE
)A