如何使用 SQLite 重现 MS Access 转换

问题描述 投票:0回答:1

经过几天的研究和测试,我必须问你这个问题:-)

我正在尝试重现 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   ....    ....   ....

在我失去所有头发之前,欢迎回答:-)

谢谢您的回复

sql sqlite pivot transform
1个回答
0
投票

本质上,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
© www.soinside.com 2019 - 2024. All rights reserved.