[英]Convert Access TRANSFORM/PIVOT query to SQL Server
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
我已閱讀所有其他帖子,但無法將其轉換為相同的
這是使用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;
例如,這將為您提供:
| DESCRIPTION | PERIOD1 | PERIOD2 | PERIOD3 |
---------------------------------------------
| D1 | 10 | 0 | 20 |
| D2 | 100 | 1000 | 0 |
| D3 | 50 | 10 | 2 |
請注意,在使用 MS SQL Server PIVOT
表運算符時,您必須輸入透視列的值。 但是,在 MS Access 中,這是TRANSFORM
with PIVOT
所做的工作,即動態獲取透視列的值。 在這種情況下,您必須使用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);
這應該給你相同的結果:
| DESCRIPTION | PERIOD1 | PERIOD2 | PERIOD3 |
---------------------------------------------
| D1 | 10 | 0 | 20 |
| D2 | 100 | 1000 | 0 |
| D3 | 50 | 10 | 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.