1

对不起,如果标题不合适。让我解释一下我想做什么。我有一个日历表,用于从我的销售表中获取数据。这是结果表。

SoldQty  StandardDate   RowNum
1        2013-10-30     1
5        2013-10-31     2
1        2013-10-30     3
1        2013-10-31     4
4        2013-10-30     5
1        2013-10-31     6
2        2013-10-31     8
1        2013-10-31     9

我需要的是基于行号的总和我需要前三行的值的总和,然后是接下来的三行和最后三行的总和。有没有办法实现这一点,或者我应该将它插入临时表并编写选择语句基于行号。提前致谢

更新:

预期的输出应该是这样的

Sold 
1.4   ->(sum of 1 to 3)*.20
1.8   ->(sum of 4 to 6)*.30 
2     ->(sum of 7 to 9)*.50 

要不就

  Sold 
  5.2 -> sum of all the above values
4

4 回答 4

1

下面的查询将按您描述的类别为您提供总和:

DECLARE @maxRowNumber INT

SELECT @maxRowNumber = MAX(RowNum)
FROM   Data;

WITH Sums(Description, Total)
     AS (SELECT 'Sum of 1 to 3',
                SUM(SoldQty) * .20
         FROM   Data
         WHERE  RowNum <= 3
         UNION ALL
         SELECT 'Sum of 4 to 6',
                SUM(SoldQty) * .30
         FROM   Data
         WHERE  RowNum >= 4
                AND RowNum <= 6
         UNION ALL
         SELECT 'Sum of '
                + CAST(@maxRowNumber-3 AS VARCHAR(10))
                + ' to '
                + CAST(@maxRowNumber AS VARCHAR(10)),
                SUM(SoldQty) * .30
         FROM   Data
         WHERE  RowNum >= @maxRowNumber - 3)
SELECT *
FROM   Sums 

要从类别中获取值的总和,请替换*SUM(Total)

于 2013-11-07T08:50:17.687 回答
1

当您需要对结果进行分组时,您必须有一个组来执行此操作;-)。

对于您的情况,您可以使用该列RowNum。诀窍是将序列转换为分组值。

1 - 0
2 - 0
3 - 0

4 - 1
5 - 1
6 - 1

这用数学很容易做到。(RowNum -1 ) / 3会成功的。

所以你的查询是

select count(SoldQty) from table group by (RowNum -1 ) / 3

于 2013-11-07T08:39:23.177 回答
1

您要查找的最终查询是:

select 
   sum( SoldQty * case ( ( [numrow]-1) /3) 
                  when 0 then 0.2 
                  when 1 then 0.3 
                  when 2 then 0.5 
                  end ) as result
   from [yourCalendarTable]

注意 than ( [numrow]-1) /3是整数而是小数,因为您使用整数进行运算。

于 2013-11-07T10:35:01.457 回答
0

取 count(*) 并将其存储在一个 int 变量中。然后使用上述方法“danihp”。或者添加一个带有标识的列 Max(identity_field) 然后使用相同的方法。

于 2013-11-07T07:49:29.067 回答