Microsoft Access 交叉表查询 - 如何转换为 MSSQL 视图

时间:2021-07-06 17:29:34

标签: sql-server ms-access-2016

大家晚上好。

我正在将 Access 数据库转换为 PHP 和 MSSQL。我有一个“交叉表”查询,我用它来列出所有客户经理和他们报价的销售额,我得到如下查询:

enter image description here

为了得到这个,我使用以下 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');

我无法转换此查询。任何人都可以帮忙。

预先感谢您提供的任何帮助

2 个答案:

答案 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