Hi,
aren't you looking for somthing like that :

mysql> select sum(amount),DATE_FORMAT( `paymentDate` , '%Y-%m' ) c FROM
`payments`   GROUP BY c with rollup;
+-------------+---------+
| sum(amount) | c       |
+-------------+---------+
|         200 | 2005-01 |
|          58 | 2005-02 |
|         258 | NULL    |
+-------------+---------+
3 rows in set (0.00 sec)

but this is not really far from what you did :o)

Mathias

Selon Rhino <[EMAIL PROTECTED]>:

>
> ----- Original Message -----
> From: "Russell Horn" <[EMAIL PROTECTED]>
> To: <mysql@lists.mysql.com>
> Sent: Wednesday, May 25, 2005 8:02 AM
> Subject: Cumulative Totals
>
>
> > I have a pretty simple table with a list of payments, not much more
> > than:
> >
> > paymentID | amount | paymentDate
> > 1   | 123    | 2005-01-10
> > 2   | 77    | 2005-01-13
> > 3   | 45    | 2005-02-16
> > 4   | 13    | 2005-02-17
> >
> >
> > I can get totals per month using a query like:
> >
> > SELECT SUM(amount) , DATE_FORMAT( `paymentDate` , '%Y-%m' )   FROM
> > `payments`   GROUP BY DATE_FORMAT( payments . date , '%Y-%m' )
> >
> > That would give me:
> >
> > amount | paymentDate
> > 200    | 2005-01
> > 58     | 2005-02
> >
> > Is there any way to get a running cumulative total directly from mysql?
> > Something like:
> >
> > amount | paymentDate
> > 200    | 2005-01
> > 258    | 2005-02
> >
>
> I'm not sure if this solution will appeal to you but I satisfied the same
> requirement in DB2 by writing a UDF (User-Defined Function). The function
> was called RunningSum() and was invoked as follows:
>
>     select empno, salary, runningSum(salary) as running_sum from mytable
>
> and gave the following result:
>
>     EMPNO    SALARY    RUNNING_SUM
>     00001     25000.00    25000.00
>     00002    18000.00    43000.00
>     00003    32000.00    75000.00
>
> I think that's the sort of thing you want, right?
>
> Now, I haven't actually tried porting my UDF over to MySQL so I'm not sure
> if you could even make it work in MySQL. I believe you need to be using
> Version 5.x of MySQL to be able to use UDFs and I'm still on Version 4.0.x.
>
> The other thing you need for my UDF to work in MySQL would be a scratchpad
> area. I've just skimmed the UDF section of the MySQL manual but can't see
> anything that says clearly one way or the other whether they support
> scratchpads or something functionally equivalent.
>
> I wrote my function in Java, which is apparently not supported in MySQL but
> the function itself is only a couple of lines long and doesn't use any
> features unique to Java. You should be able to do the same work in C or C++
> or (probably) SQL. The logic is very basic:
>
> a. You set up a scratchpad or global variable that is initialized to zero. I
> called this variable runningTotal. In my case, it is defined as a BigDecimal
> but you should be able to use a comparable C/C++/SQL datatype, like double.
> b. The function accepts a value from the column that is its argument. In the
> example above, that is the salary column. The function adds that value to
> the runningTotal variable.
> c. The function is called once for each row of the table that satisfies the
> query.
> Each time it is called, the function returns runningTotal and displays it
> (after the new value has been added to runningTotal).
>
> In Java, this function looks like this (diagnostic code snipped). My
> function was written to handle decimal numbers but you could change it very
> easily to handle integers by changing 'BigDecimal' to 'int' each time it
> occurs (and removing the import for java.math.BigDecimal).
>
> ============================================================================
> ===========================================================
>
> package db2v8.udf.db2general;
>
> import java.io.BufferedWriter;
> import java.math.BigDecimal;
>
> import COM.ibm.db2.app.UDF;
>
>
> /**
>  * Class RunningSum contains various methods for DB2 UDFs that involve
> keeping running
>  * totals of numeric columns.
>  *
>  * @version 1.0
>  * @since 2005-03-03
>  */
> public class RunningSum extends UDF {
>
>     /**
>      * The scratchpad for the runningSum() method. It *must* be initialized
> outside of
>      * the method.
>      */
>     private BigDecimal runningTotal = new BigDecimal(0.0);
>
>
>     /**
>      * Method runningSum() is used to accumulate a running total for a given
> column of a
>      * table.
>      *
>      * <p>Given a database query that returns multiple rows and a numeric
> input 'amount',
>      * this function returns that the sum of the current amount and the
> total of the
>      * previous amounts in the same column.</p>
>      *
>      * <p>For example, given this table:
>      * <xmp>
>      * EMPNO    SALARY
>      * 00001    25000.00
>      * 00002    18000.00
>      * 00003    32000.00
>      * </xmp>
>      * </p>
>      *
>      * <p>and this query:</p>
>      * <xmp>select empno, salary, runningSum(salary) as running_sum from
> mytable</xmp>
>      *
>      * <p>The query will return:</p>
>      * <xmp>
>      * EMPNO SALARY  RUNNING_SUM
>      * 00001 25000.00  25000.00
>      * 00002 18000.00  43000.00
>      * 00003 32000.00  75000.00
>      * </xmp>
>      *
>      * <p>In other words, the runningSum() function will return the actual
> salary of the first
>      * employee on the first row of the result, the sum of the salaries of
> the first two
>      * employees on the second row of the result, and the sum of the
> salaries of the first
>      * three employees on the third row of the result.</p>
>      *
>      * @version 1.0
>      * @since 2005-03-03
>      *
>      * @return int the total of the values in the input column that have
> been read so far
>      * @throws Exception
>      */
>     public void runningSum(BigDecimal amount, BigDecimal sum) throws
> Exception {
>
>         try {
>
>             /*
>              * Add the amount from the current row to the sum.
>              */
>             runningTotal = runningTotal.add(amount);
>
>             /* Return the value of the running total. */
>             set(2, runningTotal);
>         } catch (Exception excp) {
>             excp.printStackTrace();
>             throw new IllegalArgumentException("runningSum() - " +
> excp.getMessage());
>         }
>     }
>
> }
>
> ============================================================================
> ===========================================================
>
> Like I said, you may not want to get into something like this but I think it
> is the best way to handle your requirement. It will make it very easy for
> you to get running totals in the future and helps keep your SQL very simple.
>
> Rhino
>
>
>
> --
> No virus found in this outgoing message.
> Checked by AVG Anti-Virus.
> Version: 7.0.322 / Virus Database: 266.11.16 - Release Date: 24/05/2005
>
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
>
>



-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to