我有这个问题:
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
答案 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);
再次 - 我没有机器来调试它 - 并且让它漂亮...... 但我认为这应该足以让你得到这个想法......