【发布时间】:2021-12-29 10:23:15
【问题描述】:
我正在尝试使以下查询正常工作,但努力使 PIVOT 函数正常工作,通常会出现语法错误或多绑定错误,具体取决于我的结构方式。我对 PIVOT 操作员完全陌生,所以我还不确定如何解决这个问题。现在月份/期间像下面的示例数据一样垂直拉动,我正在尝试将此期间/月份字段 (fpr) 作为水平列。
| com | fpr | led | Total |
|---|---|---|---|
| 144 | 1 | 5-325 | $2442 |
| 144 | 1 | 6-522 | $56757 |
| 144 | 2 | 5-325 | $4355 |
SELECT t.com,
t.fy,
t.ledg,
b.pl,
b.desc,
ISNULL(SUM(t.Debit_$ - t.Credit_$),0) AS Total_$
FROM (SELECT com,
fy,
fpr,
ledg,
CASE WHEN dc = 1 THEN amt_1 ELSE 0 END AS Debit_$,
CASE WHEN dc = 2 THEN amt_1 ELSE 0 END AS Credit_$
FROM dbo.mas31) AS t
LEFT JOIN dbo.sam13 AS b ON t.ledg = b.ledg
AND t.com = b.com)
PIVOT (SUM(Total_$)
FOR fpr IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) AS pt
【问题讨论】:
-
老实说,不要使用
PIVOT。条件聚合的限制要小得多,而且(在我看来)语法更容易阅读。 -
如果您遇到错误,请将其包含在问题中。另外,不要忘记在样本数据中包含您的预期结果。
-
旁注:
DESC是一个Reserved Keyword,应该不用于对象名称。如果您“必须”拥有一个对象,该对象的名称具有保留关键字,则必须使用 T-SQL(方括号 ([]))或 ANSI SQL (双引号 (")) 分隔标识符。但是,同样,不要使用保留关键字的名称(或一般需要定界标识符的名称)。 -
我明白了,不知道 DESC。就像你说的那样,它实际上是系统中的 [desc],所以现在这很有意义,我修剪了很多代码/字段以使问题的长度更精简。
-
您的问题是在
PIVOT之前没有表别名,在dbo.mas31) AS t上也有无关的)。而且你需要做select pt.*,你不能引用任何数据透视表
标签: sql sql-server tsql pivot