【问题标题】:SQL: PIVOT on Trial Balance QuerySQL:关于试算表查询的 PIVOT
【发布时间】: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


【解决方案1】:

在源查询中计算总计。
并且只选择源查询中将由枢轴聚合的字段。

(未经测试的记事本涂鸦)

SELECT * 
FROM (
  SELECT m.com, m.fy, m.ledg, s.pl, s.[desc], m.fpr
  -- debet - credit = total
  , (IIF(m.dc=1, m.amt_1, 0) - IIF(m.dc=2, m.amt_1, 0)) AS [Total_$]
  FROM dbo.mas31 AS m
  LEFT JOIN dbo.sam13 AS s 
    ON s.ledg = m.ledg
   AND s.com = m.com
) AS Src
PIVOT (
  SUM([Total_$])
  FOR fpr IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) AS Pvt

【讨论】:

    【解决方案2】:

    就像其中一个 cmets 提到的那样,如果您需要聚合多个列,而不是像 pivot 那样仅按它们进行分组,条件聚合非常易于阅读/管理并且更加灵活。

    select 
        com, 
        led, 
        sum(case when fpr=1 then total end) as [1], 
        sum(case when fpr=2 then total end) as [2]
    from (...) t
    group by 
        com,
        led
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多