微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

大家晚上好。

我正在将 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');

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

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

解决方法

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,'yyyy-MM')
ORDER BY c.AccountManager,'yyyy-MM');
,

大卫布朗是对的。也许您应该考虑将其移至表示层。

也就是说,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,7),7) 
       ) src
 Pivot ( sum(Value) for Item in (' + stuff((Select Distinct ','+QuoteName( left([dateProducted],7) ) 
                                               From tblQuotes
                                               Order By 1
                                               For XML Path('')),1,'')  + ') ) pvt
'

Exec(@SQL);
--Print @SQL

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。