将 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的主要内容,如果未能解决你的问题,请参考以下文章