MySQL 自定义计算视图

MySQL Custom calculate views

我在尝试组合我正在使用的一组查询时遇到困难。我目前不得不执行多个具有不同年份和 CID 号码的查询。 (CID为1-5,Years为CurrentYear到CurrentYear-6)

当前 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,
...

这个returns:

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     | ...

任何人都可以提供有关处理此问题的最佳方法的任何见解吗?

您可以使用所需的年份和 CID 构建一个临时的 table,然后加入您的查询以同时完成所有这些。这么多子查询会很慢,但比手动执行每个查询要好。

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

只需在子查询中使用 table 中的年份和 CID,您就可以开始了。