将 Access 交叉表查询转换为 SQL Server

Posted

技术标签:

【中文标题】将 Access 交叉表查询转换为 SQL Server【英文标题】:Convert Access Crosstab Query to SQL Server 【发布时间】:2021-06-10 11:47:56 【问题描述】:

我在 MS Access 中有一个交叉表查询,在将我的后端迁移到 SQL Server 2017 后运行速度非常慢。所以我想在 SQL 中创建一个执行相同聚合的视图。

MS 访问查询:

TRANSFORM Sum([Auftrag Positionen].Gesamtpreis) AS SummevonGesamtpreis
SELECT Format$([Stammdaten Datum].[Datum],'yyyy\/mm    mmmm') AS Monat, Sum([Auftrag Positionen].Gesamtpreis) AS Gesamt
FROM [Stammdaten Datum] LEFT JOIN (Auftrag LEFT JOIN ([Stammdaten Statistik] RIGHT JOIN [Auftrag Positionen] ON [Stammdaten Statistik].Kennzeichen = [Auftrag Positionen].Statistik) ON Auftrag.[Auftrags-Nummer] = [Auftrag Positionen].[Auftrags-Nummer]) ON [Stammdaten Datum].Datum = Auftrag.Auftragseingang
WHERE (((Auftrag.[Auftrag-Angebot])="Auftrag"))
GROUP BY Format$([Stammdaten Datum].[Datum],'yyyy\/mm    mmmm')
ORDER BY Format$([Stammdaten Datum].[Datum],'yyyy\/mm    mmmm') DESC 
PIVOT [Stammdaten Statistik].Beschreibung; 

我知道我可以取消访问日期格式:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, [Stammdaten Datum].[Datum]), 0) AS Monat, Sum([Auftrag Positionen].Gesamtpreis) AS Gesamt
FROM [ROBI_1].[dbo].[Stammdaten Datum] LEFT JOIN ([ROBI_1].[dbo].Auftrag LEFT JOIN (ROBI_1.dbo.[Stammdaten Statistik] RIGHT JOIN ROBI_1.dbo.[Auftrag Positionen] ON [Stammdaten Statistik].Kennzeichen = [Auftrag Positionen].Statistik) ON Auftrag.[Auftrags-Nummer] = [Auftrag Positionen].[Auftrags-Nummer]) ON [ROBI_1].[dbo].[Stammdaten Datum].Datum = Auftrag.Auftragseingang
WHERE ((([Auftrag].[Auftrag-Angebot])='Auftrag'))
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, [Stammdaten Datum].[Datum]), 0)
ORDER BY DATEADD(MONTH, DATEDIFF(MONTH, 0, [Stammdaten Datum].[Datum]), 0) DESC 

但我不知道如何进行数据透视聚合,我尝试过的一切都给了我语法错误。 (我确实是 SQL/T-SQL 的菜鸟)。 感谢您的帮助!

【问题讨论】:

请养成善用换行和空白的习惯;它使您的代码更具可读性。另外,您嵌套ON 子句是否有原因?很少需要这样做(在 T-SQL 中)。 T-SQL 不允许像 Access 那样使用可变数量的列名。有关如何翻译的示例,请参阅 this Q&A,但您确实想在 Access 中进行透视。您可以根据已使用直通查询创建的 T-SQL 查询创建数据透视查询。 【参考方案1】:

我猜应该是这样的:

;WITH   MonatGesamt AS 
    (
        SELECT
                    Monat       =   DATEPART(MONTH, SD.Datum)
                ,   Gesamtpreis =   ISNULL(AP.Gesamtpreis, 0)

        FROM        ROBI_1.dbo.[Stammdaten Datum]       SD      
        LEFT JOIN   ROBI_1.dbo.Auftrag                  AT  ON  AT.Auftragseingang      =   SD.Datum
        LEFT JOIN   ROBI_1.dbo.[Auftrag Positionen]     AP  ON  AP.[Auftrags-Nummer]    =   AT.[Auftrags-Nummer]
     
        WHERE       AT.[Auftrag-Angebot]    =   'Auftrag'
    )
    
SELECT  
            Monat   
        ,   Gesamt  =   SUM(Gesamtpreis)
FROM        MonatGesamt
GROUP BY    Monat
ORDER BY    Monat   DESC

【讨论】:

以上是关于将 Access 交叉表查询转换为 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

Access和/或SQL中的交叉表查询完成表组合

怎么设置access查询中空值为0?

Access 2016:在反向交叉表查询中删除重复代码

SQLServer中的交叉查询

将 T-SQL 交叉应用转换为 Oracle

使用表单过滤交叉表查询 MS Access 2010