I have the following query:
SELECT
SUM(\"balance_transactions\".\"fee\") AS sum_id
FROM \"balance_transactions\"
JOIN charges ON balance_transactions
I worked on the following code. It uses an XML file. The file or string contains the date ranges you need to sumarize. The Stored Procedure will return a table with the totals per specific range.
/*****************CREATES/POPULATES FAKE TABLES WITH A SIMILAR STRUCTURE TO THE ONE YOU ARE USING************/
DECLARE @balance_transactions TABLE(fee FLOAT,
source INT,
account_id INT,
[type] VARCHAR(25),
created DATETIME)
INSERT INTO @balance_transactions
SELECT 12.5, 1, 6, 'charge', '01/15/2012'
UNION
SELECT 70, 2, 6, 'charge', '01/16/2012'
UNION
SELECT 136.89, 3, 6, 'charge', '01/17/2012'
UNION
SELECT 29.16, 4, 6, 'charge', '01/18/2012'
UNION
SELECT 1369.54, 5, 6, 'charge', '02/21/2012'
UNION
SELECT 468.85, 6, 6, 'charge', '02/22/2012'
UNION
SELECT 65.8, 7, 6, 'charge', '02/22/2012'
UNION
SELECT 1236.87, 8, 6, 'charge', '02/22/2012'
DECLARE @charges TABLE(balance_id INT,
refunded BIT,
invoice INT)
INSERT INTO @charges
SELECT 1, 0, 7
UNION
SELECT 2, 0, 8
UNION
SELECT 3, 0, 9
UNION
SELECT 4, 0, 10
UNION
SELECT 5, 0, 11
UNION
SELECT 6, 0, 12
UNION
SELECT 7, 0, null
UNION
SELECT 8, 0, null
/*******************************************************/
/*
You can use the code below for creating an Stored Procedure.
The SP will return a table with the SUM of all those values indicating the Date Range.
spGetTotalsPerDateRange 'your xml goes here'
results:
fromDate |toDate |total
2012-01-15 00:00:00.000 |2012-01-30 00:00:00.000 |248.55
2012-02-15 00:00:00.000 |2012-02-28 00:00:00.000 |3141.06
*/
SET DATEFORMAT MDY
DECLARE @XmlDocumentHandle int
DECLARE @XmlDocument nvarchar(4000)
SET @XmlDocument =
N'
01/15/2012
01/30/2012
02/15/2012
02/28/2012
'
EXEC sp_xml_preparedocument @XmlDocumentHandle OUTPUT, @XmlDocument
DECLARE @feeTotal TABLE(fromDate DATETIME,
toDate DATETIME,
total FLOAT)
DECLARE @fromDate DATETIME
DECLARE @toDate DATETIME
DECLARE ranges_cur CURSOR FOR
SELECT fromDate, toDate
FROM OPENXML (@XmlDocumentHandle, '/dates/range',2)
WITH (fromDate DATETIME,
toDate DATETIME);
OPEN ranges_cur;
FETCH NEXT FROM ranges_cur INTO @fromDate, @toDate;
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @feeTotal
SELECT @fromDate,
@toDate,
SUM(bt.fee)
FROM @balance_transactions bt
INNER JOIN @charges c ON bt.source = c.balance_id
WHERE bt.account_id = 6
AND (bt.type = 'charge'
AND c.refunded = 0
AND c.invoice IS NOT NULL)
AND (bt.created >= @fromDate AND bt.created <= @toDate);
FETCH NEXT FROM ranges_cur INTO @fromDate, @toDate;
END;
CLOSE ranges_cur;
DEALLOCATE ranges_cur;
SELECT fromDate,
toDate,
total
FROM @feeTotal
EXEC sp_xml_removedocument @XmlDocumentHandle
GO
The parametrized query will look like the following one.
CREATE PROCEDURE spGetTotalsPerDateRange(@XmlDocument NVARCHAR(4000),
@type VARCHAR(50) = 'charge',
@refunded BIT = 0)
AS
BEGIN
SET DATEFORMAT MDY
DECLARE @XmlDocumentHandle INT
EXEC sp_xml_preparedocument @XmlDocumentHandle OUTPUT, @XmlDocument
DECLARE @feeTotal TABLE(fromDate DATETIME,
toDate DATETIME,
total FLOAT)
DECLARE @fromDate DATETIME
DECLARE @toDate DATETIME
DECLARE ranges_cur CURSOR FOR
SELECT fromDate, toDate
FROM OPENXML (@XmlDocumentHandle, '/dates/range',2)
WITH (fromDate DATETIME,
toDate DATETIME);
OPEN ranges_cur;
FETCH NEXT FROM ranges_cur INTO @fromDate, @toDate;
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @feeTotal
SELECT @fromDate,
@toDate,
SUM(bt.fee)
FROM balance_transactions bt
INNER JOIN charges c ON bt.source = c.balance_id
WHERE bt.account_id = 6
AND (bt.type = 'charge'
AND c.refunded = 0
AND c.invoice IS NOT NULL)
AND (bt.created >= @fromDate AND bt.created <= @toDate);
FETCH NEXT FROM ranges_cur INTO @fromDate, @toDate;
END;
CLOSE ranges_cur;
DEALLOCATE ranges_cur;
SELECT fromDate,
toDate,
total
FROM @feeTotal
EXEC sp_xml_removedocument @XmlDocumentHandle
END
GO
The first code was tested using fake data and it works properly. You need to make the required adjustments to types and names to the SP columns and variable types in accordance to your tables definition.
The idea of this approach is being able to report any information in the way you need it. You can also pass additional parameters via XML attributes. Check more info of OPEN XML on MSDN website
Hope it helps