如何组合聚合函数 Sum() 和 Max()
How to combine aggregate function Sum() and Max()
我正在编写一份报告,以编译来自 ORDERS
和 ORDERS_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 BY
和 TOP
:
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
我正在编写一份报告,以编译来自 ORDERS
和 ORDERS_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 BY
和 TOP
:
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