【问题标题】:How to call a parameter inside a PIVOT statement in SQL Server如何在 SQL Server 的 PIVOT 语句中调用参数
【发布时间】:2020-08-21 19:53:45
【问题描述】:

我需要参数化我的查询,以便 FM 在 IN PIVOT 中获取作为参数传递的值:enter code here

这是有效的:

ALTER PROCEDURE [dbo].[sp_Head]
    @fiscalYear int,
    @fiscalMonth int 
AS 
    SELECT * 
    FROM 
        (SELECT tblrB.Company, tblrB.FM, tblrB.Amount 
         FROM tblrB 
         WHERE tblrB.FY = @fiscalYear 
           AND tblrB.FM = @fiscalMonth 
         GROUP BY tblrB.CompanyCd, tblrB.Cd, tblrB.FM, tblrB.Amount) t 
    PIVOT 
        (SUM(Amount) FOR FM IN ([12]) --12 AS EXAMPLE) p;

但不是这不是:

ALTER PROCEDURE [dbo].[sp_Head]
    @fiscalYear int,
    @fiscalMonth int 
AS 
    SELECT * 
    FROM 
        (SELECT tblrB.Company, tblrB.FM, tblrB.Amount
         FROM tblrB 
         WHERE tblrB.FY = @fiscalYear AND tblrB.FM = @fiscalMonth 
         GROUP BY tblrB.Company, tblrB.Cd, tblrB.FM, tblrB.Amount) t 
    PIVOT 
        (SUM(Amount) FOR FM IN ([@fiscalMonth ])) p;

【问题讨论】:

标签: sql-server stored-procedures parameters pivot


【解决方案1】:

为此,您需要动态 SQL:

DECLARE @sql nvarchar(max) = N'
  SELECT * FROM 
  (
    SELECT tblrB.Company, tblrB.FM, tblrB.Amount
      FROM dbo.tblrB 
      WHERE tblrB.FY = @fy AND tblrB.FM = @fm
  ) AS t 
  PIVOT 
  (
    SUM(Amount) FOR FM IN (' + QUOTENAME(@fiscalMonth) + N')
  ) AS p;';

EXEC sys.sp_executesql @sql, N'@fy int, @fm int', @fiscalYear, @fiscalMonth;

虽然如果您只返回一列,我认为根本不需要PIVOT;这似乎是一个标准的GROUP BY

SELECT Company, Amount = SUM(Amount)
  FROM dbo.tblrB
  WHERE tblrB.FY = @fiscalYear AND tblrB.FM = @fiscalMonth
  GROUP BY Company;  

如果PIVOT 的目的是有一个动态命名的列标题,那么您可以在表示层执行此操作(无论是渲染结果打印出它的月份编号必须知道它何时调用该过程),但即使您绝对必须让它来自 SQL Server,使用GROUP BY 比使用PIVOT 更容易(至少恕我直言):

DECLARE @sql2 nvarchar(max) = N'SELECT Company, ' 
  + QUOTENAME(@fiscalMonth) + N' = SUM(Amount)
    FROM dbo.tblrB
    WHERE tblrB.FY = @fy AND tblrB.FM = @fm
    GROUP BY Company;';
    
EXEC sys.sp_executesql @sql2, N'@fy int, @fm int', @fiscalYear, @fiscalMonth;

Working fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多