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,您就可以开始了。
我在尝试组合我正在使用的一组查询时遇到困难。我目前不得不执行多个具有不同年份和 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,您就可以开始了。