【发布时间】: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