将访问交叉表查询转换为 SQL Server

时间:2021-06-10 11:47:56

标签: sql-server tsql ms-access

我在 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 的菜鸟)。 感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我想应该是这样的:

;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