在多列上查询具有不同条件的数据

时间:2019-09-16 19:58:37

标签: sql sql-server

我有一个带有日期列和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());

以下是一些示例数据:

enter image description here

这就是我想要结果的方式:

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)。

3 个答案:

答案 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