我有一个带有日期列和3个其他列的表:X,Y,Z。
我要获取日期,上个月的X和Y,Z列所有先前日期的总和。
这是我处理过的查询:
SELECT date,
x,
y,
(
SELECT z
FROM Table
WHERE date < DATEADD(DAY, -(DAY(GETDATE())), GETDATE())
)
FROM Table
WHERE date BETWEEN DATEADD(mm, DATEDIFF(mm, 0, GETDATE()) - 1, 0) AND
DATEADD(DAY, -(DAY(GETDATE())), GETDATE());
以下是一些示例数据:
这就是我想要结果的方式:
date | X | Y | Z
-----------+---+---+---
2019-08-01 | 8 | 8 | 14
2019-08-02 | 2 | 2 | 14
日期,X和Y仅代表上个月,Z代表所有时间的总和(1 + 1 + 2 + 8 + 2 = 14)。
答案 0 :(得分:2)
这是您想要做的一种方法:
select t.date, t.x, t.y, t.new_z
from (select t.*, sum(z) over () as new_z,
rank() over (order by year(date) desc, month(date) desc) as seqnum
from t
) t
where seqnum = 1;
实际上,您也可以这样做:
select top (1) with ties t.date, t.x, t.y, sum(z) over () as z
from t
order by year(date) desc, month(date) desc;
答案 1 :(得分:1)
您步入正轨,但您缺少一些东西。
SELECT max(OrderDate),CustomerID,EmployeeID,
(从[订单]中选择sum(ShipperID)
WHERE OrderDate <='1996-07-15'
)
从[订单]
WHERE OrderDate <='1996-07-15';
SELECT OrderDate,CustomerID,EmployeeID,
(从[Orders]里面选择sum(ShipperID)
WHERE inside.OrderDate <= outside.OrderDate
)
从[订单]以外
在'1996-07-11'和'1996-07-15'之间的OrderDate;
WITH SumZ as (select sum(ShipperID) as zColumn from [Orders] inside
WHERE inside.OrderDate <= '1996-07-15')
SELECT OrderDate, CustomerID, EmployeeID, SumZ.zColumn
FROM [Orders] outside, SumZ
WHERE OrderDate between '1996-07-11' and '1996-07-15';
我使用了不同的数据集,但效果相同。*
https://www.w3schools.com/sql/trysql.asp?filename=trysql_op_in
由于您希望所有z
列都相同,因此使用WITH
(实际上称为“公用表表达式”或CTE)可防止您的查询多次运行同一个子查询。由于JOIN
没什么可做的,所以我没有做任何事情,但是您可以像其他表格,视图等一样在CTE上JOIN
。
有关CTE的更多信息:
https://www.essentialsql.com/introduction-common-table-expressions-ctes/
和
When to use Common Table Expression (CTE)
它根据“最大” Orders
查询Date
表,从该行的3列中获取数据,并根据与外部数据相同的标准求和第4列的值查询。
*在我的示例中,数据仅用于示例,并不意味着任何有用的信息。 我还简化了日期选择,因为我使用的数据实际上没有包含事实证明,它是Date
列。Date
列。
答案 2 :(得分:1)
这检查上个月。已更新以获取新的示例数据。
select
(select t2.x from sample t2 where (month(t2.date) = month(getdate()) - 1) and year(t2.date) = year(getdate())
and t2.date = (select max(t3.date) from sample t3)) as x,
(select t2.y from sample t2 where (month(t2.date) = month(getdate()) - 1) and year(t2.date) = year(getdate())
and t2.date = (select max(t3.date) from sample t3)) as y,
sum(t1.z) as z
from sample t1