2013-07-28 3 views
2

I는 다음과 같이 두 개의 테이블이 있습니다데이터를 반복적으로 가입 수평

Categories (CategoryId, Type, Name) 
Transactions (TxnId, DateTime, Amount, CategoryId) 

내가 매월 각 카테고리의 모든 트랜잭션 SUM을 싶어합니다.

날짜 범위 (예 : 달 2013-07-01 <= Transactions.DateTime < 2013-08-01)가 주어진 각 범주의 합계를 생성하는 sproc (아래 참조)을 사용하면이 작업을 수행 할 수 있지만 데이터베이스의 모든 달에 대해 수행하는 방법을 알지 못합니다. 그래서 내가 반복 SPROC를 실행할 수 결정 다른 달 동안 합계를 얻기 위해 (다른 최소/최대 날짜 주어).

나는 하나의 테이블에 결과를 결합하고 싶습니다.

내 카테고리 합계 SPROC 다음과 같습니다 :

SELECT 
    Categories.Name, 
    Categories.Type, 
    Categories.CategoryId, 
    CategorySpendingForMonth.Amount 
FROM 
    Categories 
    LEFT OUTER JOIN (

     SELECT 
      CategoryId, 
      SUM(Amount) AS Amount 
     FROM 
      Txns 
     WHERE 
      [DateTime] >= @fromDate 
      AND 
      [DateTime] < @toDate 
     GROUP BY 
      CategoryId 

    ) AS CategorySpendingForMonth ON Categories.CategoryId = CategorySpendingForMonth.CategoryId 
ORDER BY 
    Categories.Type, 
    Categories.Name 
Name  Type CatId Amount 
Car   0  9  -183.22 
Electricity 0  12  -86.05 
Insurance 0  17  NULL 
Internet 0  14  -39.99 
Phone  0  23  -50.04 
Rent  0  19  -2284.80 
Xoom  0  25  -604.99 

그러나 나는 다음과 같이 할 : 846,510,403,210 내 결과는 다음과 같다 그래서 나는 간단하게 할 수 생각

Name  Type CatId June  July  Aug 
Car   0  9  -183.22  -183.22  -183.22 
Electricity 0  12  -86.05  -86.05  -86.05 
Insurance 0  17  NULL  -12.30  NULL 
Internet 0  14  -39.99  -39.99  -39.99 
Phone  0  23  -50.04   -50.04 -50.04 
Rent  0  19  -2284.80 -2284.80 -2284.80 
Xoom  0  25  -604.99  -604.99  -604.99 

(추가 개월 추가 열 추가)

을 매월 sproc을 호출하여 데이터를 추가하고 싶지만 기존 데이터를 함께 결합하는 방법을 모르겠다 (만약 수직 인 경우 UNION을 사용하지만 이것은 수평이다).

이 내가 마음에 (유효하지 않은 SQL)이 무엇 :

SELECT 
    Name, 
    Type, 
    CategoryId, 
    Amount 
FROM 
    EXEC CategoriesSummary('2013-07-01', '2013-08-01') 
    FOR i = 0 TO 12 
     LEFT OUTER JOIN CategoriesSummary('2013-' + (7 + i) +'-01', '2013-' + (8 + 1) + '-01') 
    NEXT 

을 ....하지만이 유효하지 않은, 그래서이 문제를 해결하는 가장 좋은 방법은 무엇인가?

감사합니다.

답변

1
: TVFs에 대한 문서가 여기에있다

SELECT * FROM dbo.tvf('1/1/2000') 

: 같은

CREATE FUNCTION dbo.tvf(@fromDate DATETIME) 
RETURNS @rows TABLE 
(
    val UNIQUEIDENTIFIER PRIMARY KEY 
) 
AS 
BEGIN 
INSERT INTO @rows 
SELECT 
    valId AS val 
FROM 
    Values 
WHERE changed > @fromDate 
ORDER BY 
    valid 
RETURN 
END 

그런 다음 TVF을 사용할 수 있습니다

보다 일반적인 해결책은 다른 질문 https://stackoverflow.com/a/13583258/1744834에서 내 대답을보십시오.

declare @Year int = 2013 

;with CTE as 
(
    select C.Name, datepart(mm, T.DateTime) as M, sum(T.Amount) as Amount 
    from Txns as T 
     left outer join Categories as C on C.categoryId = T.categoryID 
    where 
     T.DateTime >= dateadd(yy, 2013 - datepart(yy, 0), 0) and 
     T.DateTime < dateadd(yy, 2013 - datepart(yy, 0) + 1, 0) 
    group by C.Name, datepart(mm, T.DateTime) 
) 
select 
    Name, 
    p.[1] as [January], 
    p.[2] as [February], 
    p.[3] as [March], 
    p.[4] as [April], 
    p.[5] as [May], 
    p.[6] as [June], 
    p.[7] as [July], 
    p.[8] as [August], 
    p.[9] as [September], 
    p.[10] as [October], 
    p.[11] as [November], 
    p.[12] as [December] 
from CTE as C 
pivot 
(
    sum(Amount) 
    for M in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]) 
) as p 

SQL FIDDLE EXAMPLE

를 참조하십시오, 당신은 그것을 위해 PIVOT을 사용할 수 있습니다 :) 덜 일반적인 솔루션에 대한

관련 문제