按年份的动态列名称

时间:2014-02-27 20:45:24

标签: sql-server

有没有办法根据当前年度标题我的查询字段/列?例如,在下面的查询中,id就像字段名称是sales2012而不是TwoPriorYrs_sales。目标是2015年1月1日该领域将自动成为sales2013

(SELECT SUM(sales_dol) 
FROM dbo.sumsales 
WHERE  (a.part_code = part_code) 
AND (YEAR(sale_date) = YEAR(GETDATE()) - 2)) AS TwoPriorYrs_sales

有没有办法做类似

的事情
(SELECT SUM(sales_dol) 
FROM dbo.sumsales 
WHERE  (a.part_code = part_code) 
AND (YEAR(sale_date) = YEAR(GETDATE()) - 2)) AS ('sales'+ (YEAR(getdate())-2))

谢谢!

M.Ali? 我将动态sql放在具有多列的查询中?每列是否必须单独声明?以下是SQL,我希望将年份放在最后两列中:

    SELECT     a.cust_code, a.part_code, c.part_desc, c.part_status, c.part_ddate, c.part_dtype,
                          (SELECT     SUM(qty_sold) AS Expr1
                            FROM          dbo.sumsales AS b
                            WHERE      (a.cust_code = cust_code) AND (a.part_code = part_code) AND (YEAR(sale_date) = YEAR(GETDATE()))) AS YTD_qty, ROUND
                          ((SELECT     SUM(sales_dol) AS Expr1
                              FROM         dbo.sumsales AS b
                              WHERE     (a.cust_code = cust_code) AND (a.part_code = part_code) AND (YEAR(sale_date) = YEAR(GETDATE()))), 2) AS YTD_sales,
                          (SELECT     SUM(qty_sold) AS Expr1
                            FROM          dbo.sumsales AS b
                            WHERE      (a.cust_code = cust_code) AND (a.part_code = part_code) AND (YEAR(sale_date) = YEAR(GETDATE()) - 1) AND (sale_date <= DATEADD(Year, - 1, 
                                                   GETDATE()))) AS YTDLastYr_qty, ROUND
                          ((SELECT     SUM(sales_dol) AS Expr1
                              FROM         dbo.sumsales AS b
                              WHERE     (a.cust_code = cust_code) AND (a.part_code = part_code) AND (YEAR(sale_date) = YEAR(GETDATE()) - 1) AND (sale_date <= DATEADD(Year, - 1, 
                                                    GETDATE()))), 2) AS YTDLastYr_sales,
                          (SELECT     SUM(qty_sold) AS Expr1
                            FROM          dbo.sumsales AS b
                            WHERE      (a.cust_code = cust_code) AND (a.part_code = part_code) AND (YEAR(sale_date) = YEAR(GETDATE()) - 1)) AS LastYr_qty, ROUND
                          ((SELECT     SUM(sales_dol) AS Expr1
                              FROM         dbo.sumsales AS b
                              WHERE     (a.cust_code = cust_code) AND (a.part_code = part_code) AND (YEAR(sale_date) = YEAR(GETDATE()) - 1)), 2) AS LastYr_sales,
                          (SELECT     SUM(qty_sold) AS Expr1
                            FROM          dbo.sumsales AS b
                            WHERE      (a.cust_code = cust_code) AND (a.part_code = part_code) AND (YEAR(sale_date) = YEAR(GETDATE()) - 2)) AS TwoPriorYrs_qty, ROUND
                          ((SELECT     SUM(sales_dol) AS Expr1
                              FROM         dbo.sumsales AS b
                              WHERE     (a.cust_code = cust_code) AND (a.part_code = part_code) AND (YEAR(sale_date) = YEAR(GETDATE()) - 2)), 2) AS TwoPriorYrs_sales
FROM         dbo.sumsales AS a INNER JOIN
                      dbo.partmstr AS c ON a.part_code = c.part_code INNER JOIN
                      dbo.orderfrom AS d ON a.cust_code = d.cust_code
WHERE     (YEAR(a.sale_date) >= YEAR(GETDATE()) - 2)
GROUP BY a.cust_code, a.part_code, c.part_desc, c.part_status, c.part_ddate, c.part_dtype

1 个答案:

答案 0 :(得分:1)

如果你想动态设置列名,你必须使用像这样的动态sql来做...

DECLARE @Sql NVARCHAR(MAX);
DECLARE @Column_Alias NVARCHAR(MAX);

SET @Column_Alias = 'Year'+ CAST(YEAR(GETDATE())-2 AS NVARCHAR);


 SET @Sql =  N'SELECT SUM(sales_dol) AS ' + @Column_Alias +
             N'FROM dbo.sumsales 
               WHERE  a.part_code = part_code 
               AND YEAR(sale_date) = YEAR(GETDATE())-2'

 EXECUTE sp_executesql @Sql