将 Access TRANSFORM/PIVOT 查询转换为 SQL Server

Posted

技术标签:

【中文标题】将 Access TRANSFORM/PIVOT 查询转换为 SQL Server【英文标题】:Convert Access TRANSFORM/PIVOT query to SQL Server 【发布时间】:2012-12-06 20:23:11 【问题描述】:
TRANSFORM Avg(CASE WHEN [temp].[sumUnits] > 0 
                   THEN [temp].[SumAvgRent] / [temp].[sumUnits] 
                   ELSE 0 
              END) AS Expr1
SELECT [temp].[Description]
  FROM [temp] 
GROUP BY [temp].[Description]
PIVOT [temp].[Period];

需要将此查询转换为sql server

我已阅读所有其他帖子,但无法将其转换为相同的

【问题讨论】:

你能解释一下你想对一些样本数据和期望的输出做什么吗? @MahmoudGamal :不知道它只是一些用 ms 访问编写的查询。我们必须使用 sql server 2005 将程序转换为 php 应用程序! 【参考方案1】:

这是使用PIVOT 表运算符的等效版本:

SELECT *
FROM
(
  SELECT 
    CASE 
      WHEN sumUnits > 0 
      THEN SumAvgRent / sumUnits ELSE 0 
  END AS Expr1,
  Description,
  Period
  FROM temp
) t
PIVOT
(
  AVG(Expr1)
  FOR Period IN(Period1, Period2, Period3)
) p;

SQL Fiddle Demo

例如,这会给你:

| DESCRIPTION | PERIOD1 | PERIOD2 | PERIOD3 |
---------------------------------------------
|          D1 |      10 |       0 |      20 |
|          D2 |     100 |    1000 |       0 |
|          D3 |      50 |      10 |       2 |

注意在使用 MS SQL Server PIVOT 表运算符时,您必须输入透视列的值。但是,在 MS Access 中,这是 TRANSFORMPIVOT 所做的工作,它动态获取旋转列的值。在这种情况下,您必须使用 PIVOT 运算符动态地执行此操作,如下所示:

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

SELECT @cols = STUFF((SELECT distinct 
                        ',' +
                        QUOTENAME(Period)
                FROM temp
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');



SET @query =  ' SELECT Description, ' + @cols + '
    FROM 
    (
      SELECT 
        CASE 
          WHEN sumUnits > 0 
          THEN SumAvgRent / sumUnits ELSE 0 
      END AS Expr1,
      Description,
      Period
      FROM temp
    ) t
    PIVOT
    (
      AVG(Expr1)
      FOR Period IN( ' + @cols + ') 
    ) p ';



Execute(@query);

Updated SQL Fiddle Demo

这应该会给你同样的结果:

| DESCRIPTION | PERIOD1 | PERIOD2 | PERIOD3 |
---------------------------------------------
|          D1 |      10 |       0 |      20 |
|          D2 |     100 |    1000 |       0 |
|          D3 |      50 |      10 |       2 |

【讨论】:

感谢您的回复,现在我清楚地了解如何处理查询。让我做同样的事情并检查它是否以相同的方式工作:) 谢谢马哈茂德。您将如何将其写入 CREATE VIEW 语句? @avguchenko - AFAIK,由于动态 sql,您不能将其写入视图或 UDF,但您可以在存储过程中执行此操作,它会正常工作。跨度> 只是一个小更新没有使用XML:SQL fiddle【参考方案2】:
TRANSFORM SUM(s2+s1) 
SELECT PlanoContas.Conta AS Conta,
SPACE(LEN(PlanoContas.Conta)/2) + PlanoContas.Extenso AS Extenso,
PlanoContas.Tipo,SUM(s2+s1) AS [01/04/14] 
FROM PlanoContas 
INNER JOIN TEMP ON 
PlanoContas.Conta=LEFT(Temp.Conta,LEN(PlanoContas.Conta)) 
WHERE LEN(PlanoContas.Conta)<=16 AND (s1<>0 OR s2<>0) 
GROUP BY PlanoContas.Conta,Extenso,Tipo 
ORDER BY PlanoContas.Conta PIVOT Filial

【讨论】:

这不能回答问题。问题是询问如何将 MS Access 查询转换为 SQL Server,这在 SQL Server 中不起作用。

以上是关于将 Access TRANSFORM/PIVOT 查询转换为 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

使用 Access 2003 将 Access 2000 数据库转换为 Access 97

将 Access 链接从 SQL Server 更改为另一个 Access 文件?

access打开一个新表后之前的表将关闭吗?

如何将access中的数据导出为EXCEL文件?

Access 将多行插入 SSMS

将 EAN-13 从 Excel 导入 Access