【问题标题】:Assistance in building a query fro calulate avg(), before a month, and after a month帮助在一个月前和一个月后构建计算平均值()的查询
【发布时间】:2015-08-29 15:17:57
【问题描述】:

我必须为每个客户和 2009 年的每个月编写一个查询,计算每个月之前、每个月之后的平均购买量,并显示一个包含客户和月份的列表,其中每个月之后的平均购买量是 >月前的平均购买量。

应该显示的示例:

name         month    avgBefore   avgAfter         
P.Anderson     3          13         35

我的问题是,虽然创建包含 (name, code, month, avgAmount) 的视图 v1 相当容易(显示名称的列表,每个月的平均购买量),但我不知道(或者更确切地说,我无法想象)剩下的怎么做(计算每个月之前/之后的平均值)。

例如:第 3 个月前的平均值 = 总和(第 1 个月到第 3 个月的所有平均值),第 3 个月后的平均值 = 总和(从 3 到最大值(月)的所有平均值

有人可以帮帮我吗?

视图V1是这样的(在Management Studio中编辑视图时显示)

SELECT     
    c.name, c.code, 
    MONTH(t.DateTime) AS minas, 
    AVG(t.charged_amount) AS total
FROM
    dbo.customers AS c 
INNER JOIN
    dbo.accounts AS a ON c.code = a.customer_code 
INNER JOIN
    dbo.creditcard AS cc ON a.acc_number = cc.acc_number 
INNER JOIN
    dbo.transactions AS t ON cc.cc_number = t.cc_number 
INNER JOIN
    dbo.shop AS s ON t.shop_code = s.shop_code
WHERE
    (YEAR(t.DateTime) = 2009)
GROUP BY 
    c.name, c.code, MONTH(t.DateTime)

我试图在一个视图中分隔每个月(比如创建了 12 个视图:S)

例如:

create view [Dec](name, code, minas, averg)
as 
    select * from v1 
    where minas = 12

然后这样做:

select 
    v1.name, v1.code, v1.minas, sum(total)
from 
    v1, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, [Dec]
where 
    v1.minas <= Jan.minas or v1.minas <= Feb.minas or 
    v1.minas <= Mar.minas or v1.minas <= Apr.minas or
    v1.minas <= May.minas or v1.minas <= Jun.minas or
    v1.minas <= Jul.minas or v1.minas <= Aug.minas or
    v1.minas <= Sep.minas or v1.minas <= Oct.minas or
    v1.minas <= Nov.minas or v1.minas <= [Dec].minas 
group by 
    v1.name,v1.code,v1.minas

但是没有用。

还有一个我试过的测试:

select 
    v1.name, v1.code, v1.minas, sum(v1.total)
from 
    v1, Jan as v2, Feb as v3
where 
    v1.code = v2.code and v1.code = v3.code
group by 
    v1.name, v1.code, v1.minas

但结果是

Nelson J. Arredondo 100606 1 75
Nelson J. Arredondo 100606 2 100
Nelson J. Arredondo 100606 5 250

在第 2 个月,应该是 175,而在第 5 个月,应该是 250+175

你能帮我解决这个问题吗?

【问题讨论】:

  • 我想在做SQL之前,你最清楚统计背景。第 3 个月前的平均值 = 总和(第 1 个月到第 3 个月的所有平均值)。 1)也许你只是在这里选择了一个误导性的名字,我会排除第 3 个月并在这里使用第 1 个月和第 2 个月。 2) 仅使用平均值的总和并不能给出可比性,我至少会除以 2。在实践中,我只会使用之前范围内的平均值。
  • 以上只是查询必须返回的示例。 Actuallu view V1,有前每个月和每个客户的平均购买量。另外,我在上面尝试做的是将前几个月每个客户的所有平均值相加。假设 Nelson J. Arredondo 一月份的平均购买量为 75,二月份的平均购买量为 100。那么2月前的平均购买量为75,2月后的平均购买量为175。同理,5月份垫子前的平均购买量为75+100=175。五月之后是 75+100+250=375

标签: sql-server


【解决方案1】:

评估一行中每个用户的平均值,并使用 UNPIVOT(需要 SQL-Server 2005 或更高版本)将其转换为所需的格式,每个月和用户一行。

【讨论】:

    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多