我有一个MySQL表,其中包含10年的太阳能电池板发电数据(每10分钟一次,其中发电量>为零)。
我不知道如何构造一个查询,该查询将为我每年行提供四个值,每个值代表当年每个季度的总和。
我的源表(DTP)模式如下:
#, Field, Type, Null, Key, Default, Extra
1, 'PWR', 'decimal(5,3)', 'NO', '', NULL, ''
2, 'idDTP', 'int(11)', 'NO', 'PRI', NULL, 'auto_increment'
3, 'DT', 'datetime', 'NO', '', NULL, ''
我可能会给我指出一个正确的方向的例子是这样的(请记住,这在一定程度上是从来源修改的):
SELECT Year,SUM(Quarter1) AS Quarter1,SUM(Quarter2) AS Quarter2,SUM(Quarter3) AS Quarter3,SUM(Quarter4) AS Quarter4
FROM
(
SELECT YEAR(DT) AS 'Year' ,
Quarter1 = CASE(DATEPART(q, DTP.DT))
WHEN 1 THEN SUM(DTP.DT)
ELSE 0
END,
Quarter2 = CASE(DATEPART(q, DTP.DT))
WHEN 2 THEN SUM(DTP.DT)
ELSE 0
END,
Quarter3 = CASE(DATEPART(q, DTP.DT))
WHEN 3 THEN SUM(DTP.DT)
ELSE 0
END,
Quarter4 = CASE(DATEPART(q, DTP.DT))
WHEN 4 THEN SUM(DTP.DT)
ELSE 0
END
FROM DTP LEFT JOIN PWR ON DTP.DT = Customers.CustomerID
LEFT JOIN [Order Details] ON [Order Details].OrderID = Orders.OrderID
GROUP BY CompanyName, YEAR(OrderDate), DATEPART(q, OrderDate)
)C
GROUP BY CompanyName,Year
我开始尝试将其转换为我的场景,但在不理解它的情况下,我陷入了一个半成品(假设这是正确的)的混乱,我不知道如何解决它。任何解释良好的提示或链接都是受欢迎的-火焰,不那么受欢迎;oP
如果我选错了论坛,请礼貌地指出正确的论坛——在Stack Echange列表中找不到更好的选择。
谢谢来源数据第一年的小样本(2月-3月)
'160851', '2012-02-29 08:00:00', '0.030'
'160852', '2012-02-29 08:10:00', '0.066'
'160853', '2012-02-29 08:20:00', '0.072'
'160854', '2012-02-29 08:30:00', '0.060'
'160855', '2012-02-29 08:40:00', '0.090'
'160856', '2012-02-29 08:50:00', '0.102'
'160857', '2012-02-29 09:00:00', '0.084'
'160858', '2012-02-29 09:10:00', '0.132'
'160859', '2012-02-29 09:20:00', '0.144'
'160860', '2012-02-29 09:30:00', '0.138'
'160861', '2012-02-29 09:40:00', '0.150'
'160862', '2012-02-29 09:50:00', '0.174'
'160863', '2012-02-29 10:00:00', '0.174'
'160864', '2012-02-29 10:10:00', '0.162'
我无法输入一年的数据,因为它毫不奇怪地超过了允许的计数,但它也以类似的方式进行。
没有任何有意义的输出,因为我在接近任何可行的代码之前就已经超出了我的深度。
定义一个新的年度季度列,名为yq
。用"2021-q4"
和"2022-q1"
等值填充它。
现在你的问题很简单。只计算SUM( ... )
具有CCD_ 5。
您缺少一些表,但我将它们保留在子查询中。
subwquery将显示所有季度、每个公司和年份的数字。
外界的质疑会把它们总结成没有公司的年份。。
当你需要更多的列时,你可以从公司订单或订单详细信息中添加它们,并将它们添加到内部SELECT
中,然后将它们也添加到外部,以按订单或此类对它们进行分组
SELECT Year,SUM(Quarter1) AS Quarter1,SUM(Quarter2) AS Quarter2,SUM(Quarter3) AS Quarter3,SUM(Quarter4) AS Quarter4
FROM
(
SELECT CompanyName,YEAR(DT) AS 'Year' ,
SUM(CASE WHEN DATEPART(q, DTP.DT) = 1 THEN DTP.PWR ELSe 0 END) Quarter1,
SUM(CASE WHEN DATEPART(q, DTP.DT) = 2 THEN DTP.PWR ELSe 0 END) Quarter2,
SUM(CASE WHEN DATEPART(q, DTP.DT) = 3 THEN DTP.PWR ELSe 0 END) Quarter3,
SUM(CASE WHEN DATEPART(q, DTP.DT) = 4 THEN DTP.PWR ELSe 0 END) Quarter4
FROM DTP LEFT JOIN PWR ON DTP.DT = Customers.CustomerID
LEFT JOIN [Order Details] ON [Order Details].OrderID = Orders.OrderID
GROUP BY CompanyName, YEAR(OrderDate)
) C
GROUP BY Year
没有客户和订单
SELECT CompanyName,YEAR(DT) AS 'Year' ,
SUM(CASE WHEN DATEPART(q, DTP.DT) = 1 THEN DTP.PWR ELSe 0 END) Quarter1,
SUM(CASE WHEN DATEPART(q, DTP.DT) = 2 THEN DTP.PWR ELSe 0 END) Quarter2,
SUM(CASE WHEN DATEPART(q, DTP.DT) = 3 THEN DTP.PWR ELSe 0 END) Quarter3,
SUM(CASE WHEN DATEPART(q, DTP.DT) = 4 THEN DTP.PWR ELSe 0 END) Quarter4
FROM DTP
GROUP BY YEAR(DT)