这在SQL中可行吗?

时间:2010-12-15 22:17:15

标签: sql sql-server sql-server-2005

我有这项功课要做,我已经尝试了几个小时,甚至不知道是否可以这样做: 对于每个客户和2009年的每个月,在月份之前找到平均交易之后的平均交易,并显示客户代码列表以及第二次平均交易大于第一次交易的月份。

我尝试使用while但是失败然后尝试使用一个选择但失败然后考虑创建视图但我需要12或24取决于我如何做,然后想到创建一个表保存每个月的日期然后创建2个视图,但我怀疑这会有用。 (我在这里需要的表及其列是Clients(Code),Transactions(Date_and_time_of_transaction,Amount_of_transaction) 我不介意根本没有得到完整的解决方案。我只需要一些东西来帮助我继续解决这个问题。让我们说一个“指路明灯”。

编辑:当我开始时,我尝试了这个

DECLARE @COUNTER as int

SET @COUNTER = 0

WHILE @COUNTER <= 12

  BEGIN

   SET @COUNTER = @COUNTER + 1

    SELECT     @COUNTER as Month,Clients.Clients_Code, AVG(Transactions.Amount_of_indebtedness) as AVERAGE

    FROM         Account INNER JOIN
                  Clients ON Account.Account_Number = Clients.Account_Number INNER JOIN
                  Credit_Card ON Account.Account_Number = Credit_Card.Account_Number INNER JOIN
                  Transactions ON Credit_Card.Credit_Number = Transactions.Credit_Number

WHERE     (YEAR(Transactions.Date_and_time_of_transaction) = '2009') 
      AND (MONTH(Transactions.Date_and_time_of_transaction) < @COUNTER)

GROUP BY Clients.Clients_Code

    SELECT     @COUNTER as Month,Clients.Clients_Code, 
AVG(Transactions.Amount_of_indebtedness) as AVERAGE2

FROM         Account INNER JOIN
              Clients ON Account.Account_Number = Clients.Account_Number INNER JOIN
              Credit_Card ON Account.Account_Number = Credit_Card.Account_Number INNER JOIN
              Transactions ON Credit_Card.Credit_Number = Transactions.Credit_Number

WHERE     (YEAR(Transactions.Date_and_time_of_transaction) = '2009') 
      AND (MONTH(Transactions.Date_and_time_of_transaction) >= @COUNTER)

GROUP BY Clients.Clients_Code

  END

2 个答案:

答案 0 :(得分:2)

我会创建一个临时视图(通过“with”子句)。在这个视图中,我将得到每个客户和月的平均值。然后我会以一个是当月,另一个是月+ 1的方式将它们连接在一起。然后在where子句中,我将检查较大月份的平均值是否高于上个月。希望有所帮助。

编辑:实际上也许你甚至不加入“with view”也许你可以简单地在where子句中使用子查询,例如:“select * from withview w1 where w1.averageamount&gt;(从withview选择2.averageamount w2,其中w2.month = w1.month + 1“。这不是正确的语法,但是像这样。

答案 1 :(得分:1)

你需要这个子查询。

如果您有一个产生结果的查询    从d中选择a,b,c 你可以使它看起来像这样的查询中的表:

选择a,b from(从d中选择a,b,c)e 其中“e”是由select

中的查询生成的“表”的同义词

这应该让你去。您将需要上个月的一个子查询,下一个月的一个子查询,以及将子查询中的列与当前行相关联的方法。