大家晚上好。
我正在将 Access 数据库转换为 PHP 和 MSSQL。我有一个“交叉表”查询,我用它来列出所有客户经理和他们报价的销售额,我得到如下查询:
为了得到这个,我使用以下 SQL:
TRANSFORM Sum(tblQuotes.priceToCustomer) AS SumOfpriceToCustomer
SELECT Clients.AccountManager
FROM tblQuotes LEFT JOIN Clients ON tblQuotes.clientID = Clients.ID
GROUP BY Clients.AccountManager
PIVOT Format([tblQuotes].[dateProducted],'yyyy-mm');
我无法转换此查询。任何人都可以帮忙。
预先感谢您提供的任何帮助
答案 0 :(得分:2)
Access 有“动态交叉表查询”,而 SQL Server 没有。
您可以像在答案 here 中那样使用动态 SQL,但是由于您也在更改前端,因此您可能应该只使用 GROUP BY 查询并将结果格式化以在前端显示.例如
SELECT c.AccountManager,
format(q.dateProduced, 'yyyy-MM') Month,
Sum(q.priceToCustomer) AS SumOfpriceToCustomer
FROM tblQuotes q
LEFT JOIN Clients c
ON q.clientID = c.ID
GROUP BY c.AccountManager, format(q.dateProduced, 'yyyy-MM')
ORDER BY c.AccountManager, format(q.dateProduced, 'yyyy-MM');
答案 1 :(得分:1)
大卫布朗是对的。也许您应该考虑将其移至表示层。
也就是说,SQL Server 在设计上是声明式的。这留下了动态 SQL,它不能存在于视图中,但可以从存储过程中调用......或者......随着时间的推移需要扩展的视图。
示例
Select *
From (
SELECT Clients.AccountManager
,Item = left([tblQuotes].[dateProducted],7) -- Assuming DATE and not DATETIME. Otherwise use your Format([tblQuotes].[dateProducted],'yyyy-mm')
,Value = sum(tblQuotes.priceToCustomer)
FROM tblQuotes LEFT JOIN Clients ON tblQuotes.clientID = Clients.ID
GROUP BY Clients.AccountManager
,left([tblQuotes].[dateProducted],7)
) src
Pivot ( sum(Value) for Item in ( [2018-01]
,[2018-02]
,[2018-03]
,[2018-04]
,[2018-05]
,[2018-06]
,[2018-07]
,[2018-08]
,[2018-09]
,[2018-10] -- Continue as Far as you like
) ) pvt
或者动态 SQL
Declare @SQL varchar(max) = '
Select *
From (
SELECT Clients.AccountManager
,Item = left([tblQuotes].[dateProducted],7)
,Value = sum(tblQuotes.priceToCustomer)
FROM tblQuotes LEFT JOIN Clients ON tblQuotes.clientID = Clients.ID
GROUP BY Clients.AccountManager
,left([tblQuotes].[dateProducted],7)
) src
Pivot ( sum(Value) for Item in (' + stuff((Select Distinct ','+QuoteName( left([dateProducted],7) )
From tblQuotes
Order By 1
For XML Path('')),1,1,'') + ') ) pvt
'
Exec(@SQL);
--Print @SQL