2015-06-02 34 views
0

我很難嘗試組合我正在使用的一組查詢。我目前需要執行多個不同年份和CID號碼的查詢。 (CID是1-5歲是CurrentYear到CurrentYear-6)MySQL自定義計算視圖

當前的SQL語句:

SELECT 
1 as CID, 
2015 as `Year`, 
( SELECT SUM(legacy_reports_payments.AmountPaid) * -1 AS Payments FROM legacy_reports_payments 
    WHERE DatePaid >= "2015-01-01 00:00:00" AND DatePaid < "2015-02-01 00:00:00" 
    AND CID = 1) As PaymentsJan, 
( SELECT SUM(legacy_reports_payments.AmountPaid) * -1 AS Payments FROM legacy_reports_payments 
    WHERE DatePaid >= "2015-02-01 00:00:00" AND DatePaid < "2015-03-01 00:00:00" 
    AND CID = 1) As PaymentsFeb, 
( SELECT SUM(legacy_reports_payments.AmountPaid) * -1 AS Payments FROM legacy_reports_payments 
    WHERE DatePaid >= "2015-03-01 00:00:00" AND DatePaid < "2015-04-01 00:00:00" 
    AND CID= 1) As PaymentsMar, 
... 

這將返回:

CID | Year | PaymentsJan | PaymentsFeb | ... 
1 | 2015 | 3000.00  | 3000.00  | ... 

我想創建一個能顯示一個單一視圖所有計算的信息,而不是像上面那樣運行幾個查詢。 我想有觀點看上去就像這樣:

CID | Year | PaymentsJan | PaymentsFeb | ... 
1  | 2015 | 3000.00  | 3000.00  | ... 
2  | 2015 | 2000.00  | 2000.00  | ... 
3  | 2015 | 5000.00  | 5000.00  | ... 
1  | 2014 | 1000.00  | 3000.00  | ... 
2  | 2014 | 3000.00  | 4000.00  | ... 
3  | 2014 | 2000.00  | 5000.00  | ... 

任何人都可以提供處理的最佳方式是任何見解?

回答

0

您可以用您需要的年份和CID構建一個臨時表,然後加入您的查詢,以便一次完成所有這些查詢。很多子查詢會很慢,但比手動完成每個子查詢要好。

create table #Dates 
(
controlCID int 
,controlYear varchar(4) 
) 

DECLARE @year int = YEAR(getDate()) 
DECLARE @numYears int = 6 
DECLARE @numCID int = 5 
DECLARE @CIDcounter int 

while (@numYears > 0) 
BEGIN 
    SET @CIDcounter = @numCID 

    while (@CIDcounter > 0) 
    BEGIN 
     insert into #Dates values (@CIDcounter, (@year - @numYears + 1)) 

     SET @CIDcounter = @CIDcounter - 1 
    END 

    SET @numYears = @numYears -1 
END 

select controlCID 
    ,controlYear 
    --,( SELECT SUM(legacy_reports_payments.AmountPaid) * -1 AS Payments FROM legacy_reports_payments 
    --WHERE p.DatePaid >= (controlYear+'-01-01 00:00:00') AND p.DatePaid < (controlYear+'-02-01 00:00:00') 
    --AND p.CID = controlCID) As PaymentsJan, 
    --etc and so on... 
from #Dates 
order by controlYear desc, controlCID 

drop table #Dates 

只需在子查詢中使用表中的年份和CID,您應該很好。

+0

感謝您的回覆。我不完全確定如何運行您的查詢,因爲我是使用存儲過程的新手。當我嘗試它時,它在DECLARE語句中給我一個錯誤。有任何想法嗎? – Justin

+0

(更新)。我得到它的工作。感謝您的建議。我最終用你的想法使用了一個存儲函數。 – Justin