如何在sql的不同列中添加月份名称?

时间:2014-03-28 05:52:27

标签: sql

我有这个问题:

DECLARE @month INT
SET @month=1

SELECT 

    CLOI_ClientOrderItems.cl_Id,

    NoOfInv = SUM(CASE WHEN DATEPART(mm, in_date_issued) <= @month
                        AND DATEPART(yyyy, in_date_issued) = 2014
                       THEN 1 ELSE 0 END),

    MonthTotal = SUM(CASE WHEN DATEPART(mm, in_date_issued) <= @month 
                           AND DATEPART(yyyy, in_date_issued) = 2014
                          THEN in_total ELSE 0 END),

    Grandtotal = SUM(in_total),

    RemainingAmount = SUM(in_total) - SUM(CASE 
                          WHEN DATEPART(mm, in_date_issued) <= @month 
                          THEN in_total ELSE 0 END)


FROM (SELECT 
          DISTINCT MasterOrderId, cl_Id 
      FROM 
          CLOI_ClientOrderItems) as CLOI_ClientOrderItems 

INNER JOIN 
      IN_Invoices 
ON
      IN_Invoices.MasterOrderId = CLOI_ClientOrderItems.MasterOrderId
GROUP BY 
      CLOI_ClientOrderItems.cl_id

如果我将月份数字传递为3,则应将其显示为1月2日和3月以及相应月份的相关记录。 sql

输出我想要那样:

noofinv    amt    clid         grandtotal      jan        feb       march   remainingamt 
5          7.00   100000_Pri      245.00         0.00     238.00      7.00      238.00 
12      2510.12   100001_pro   181110.29    138891.92   39708.25   2510.12   178600.17

1 个答案:

答案 0 :(得分:0)

当你说显示时你是什么意思? 这是一个返回非日期类型的值的查询 - 所以月份应该是int?

在数据库中,日期存储为二进制对象 - 因此迁移要显示为文本的日期与在日期上运行计算不同。 你可以使用DATENAME: http://msdn.microsoft.com/en-us/library/ms174395.aspx

DATEPART - 只允许您取消部分日期。 http://msdn.microsoft.com/en-us/library/ms174420.aspx

我接近回答你的问题吗?


如果我理解正确 - 你想创建一个动态查询,它将执行并返回结果。 所以第一部分 - 将您的查询更改为字符串,而不是代码中的查询。

SET @SQLQuery = 'SELECT prev_col ,'

现在 - 在循环中连接所需的列

DECLARE @i AS SMALLINT
SET @i=1;
WHILE (@i <= month)
BEGIN
  @SQLQuery = SQLQuery + 'RemainingAmount = SUM(in_total) - SUM(CASE '+
                          'WHEN DATEPART(mm, in_date_issued) = ' + CONVERT(VARCHAR,@month)+ 
                          'THEN in_total ELSE 0 END) AS ' + 
                          DATENAME(month, DATEADD(month, @month, CAST('2008-01-01' AS datetime)))
                          +', ';
  @i=@i+1;
END
@SQLQuery = @SQLQuery + ' .... col >'+ CONVERT(VARCHAR,@month) + ' AS remaining'
@SQLQuery = @SQLQuery + ' from ..... where .....';

之后 - 只需执行它:

EXECUTE(@SQLQuery);

再次 - 我没有机器来调试它 - 并且让它漂亮...... 但我认为这应该足以让你得到这个想法......