经过几天的研究和测试,我必须问你这个问题:-)
我正在尝试重现 MS Access 查询,但无法将
transform
函数与 SQLite 一起使用
我的访问请求:
TRANSFORM First([A].TempMax) AS temperatures
SELECT [%$##@_Alias].moisjour
FROM (SELECT DTE, TempMax, Format(Month([DTE]),"00",2) & "-" & Format(Day([DTE]),"00",2) AS moisjour FROM meteoInfo ORDER BY DTE) AS [A]
GROUP BY [A].moisjour
PIVOT Format([DTE],"yyyy");
我有一个包含每天天气信息的表格。日期、最高温度、最低温度。等等...
我不需要所有字段,只需要几个。
在我的桌子上:
DTE TempMax
2022-01-01 -2, 3
2022-01-02 -7.6
...
2022-12-31 -12.7
2023-01-01 -5.9
2023-01-02 -9.2
...
2023-12-31 -15.6
2024-01-01 -2.5
2024-01-02 -4.2
2024-01-03 -6.7
...
etc.
我想获得:
DTE 2022 2023 2024
01-01 -2.3 -5.9 -2.5
01-02 -7.6 -9.2 -4.2
... .... .... ....
31-12 .... .... ....
在我失去所有头发之前,欢迎回答:-)
谢谢您的回复
本质上,Access 的
TRANSFORM
是一个将长格式数据转换为宽格式数据的枢轴查询。一般来说,条件聚合适用于任何兼容 SQL 的数据库,其中 Access 的特殊 TRANSFORM
查询避免写出每个条件列。
但是由于您的查询只是以年份为中心,因此写出每一列并不太乏味。但是,SQLite 不支持
FIRST
聚合,您可能需要 CTE 中的 ROW_NUMBER
窗口函数。 (不幸的是,Access 尚未支持这两种方法)。
WITH sub AS (
SELECT
DTE,
strftime('%Y', DTE) AS [Year],
strftime('%m-%d', DTE) AS MonDay,
ROW_NUMBER() OVER(
PARTITION BY strftime('%Y-%m-%d', DTE)
ORDER BY DTE
) AS rn
FROM meteoInfo
)
SELECT
MonDay,
MAX(CASE WHEN [Year] = '2022' AND rn = 1 THEN TempMax END) AS [2022],
MAX(CASE WHEN [Year] = '2023' AND rn = 1 THEN TempMax END) AS [2023],
MAX(CASE WHEN [Year] = '2024' AND rn = 1 THEN TempMax END) AS [2024]
FROM sub
GROUP BY
MonDay