2016-09-15 79 views
-2

我有數據看起來像這樣運行總王氏常數T-SQL

MILEAGE January February ........December 
    0  0  0 
    2  0.066 0.052 
    3  0.081 0 
    5  0  0.062 
    6  0.080 0 ......... 
813  0  0 and so on 

我想要的數據看起來像這樣

Mileage  January February ..... December 
    0   (Total of Mileage less and equal to zero for each month) 
    2000  Total of Mileage upto 2000 for each month 
    4000  Total of Mileage upto 4000 for each month 
    6000  Total of Mileage upto 6000 for each month 
    8000  and so on.... 
    10000 
    12000 
    14000 
    2 thousand increment up till 
    50000 

非常感謝您的幫助。我使用SQL Server 2008 R2和不知道如何做到這一點

+0

請說明。值「MILEAGE」(在第一個表中)與第二個表中的「上限」相比是什麼?就像MILEAGE = 813一樣,它包含在<= 2000的總數中,但不包括在總數<= 0的行中? – SlimsGhost

+0

基本上里程應該具有第二個表中定義的常數值。里程是我們從客戶收到的原始數據(第一張表格),如(福特,Gm等)。里程將包括在2000年,其餘的價值直到50000.它正在運行總計。 – user2954221

回答

1

如下所示,您可以使用遞歸CTE將表格即時列出值。但是,如果只是一個偶然的事情,你只會想這樣做。如果你打算經常這樣做(比如說每個月),就像製作其他表格一樣製作表格,然後添加一個索引並加入它。

要做的最常見的方法是有一個計數表0,1,2,3等等一些大數目。然後你可以用SELECT val*2000 FROM counting_table WHERE val*2000 >= 5000得到你的結果。這個計數表可以用於許多類似的情況,但是是通用的。

WITH mile_table as 
(
    -- use recursive cte to make a table with number 0 - 50000 by 2000 
    SELECT 0 as milage 

    UNION ALL 

    SELECT mile_table.milage+2000 
    FROM mile_table 
    WHERE mile_table.milage+2000 <= 50000 
) 
SELECT mile_table.milage, 
     sum(a.January) as January, 
     sum(a.February) as February, 
     --- .... 
     sum(a.December) as December, 
FROM mile_table 
JOIN your_table a ON a.milage >= mile_table.milage 
GROUP BY mile_Table.milage 
0

試試這樣的事情:

DECLARE @i as INT = -2000 

CREATE TABLE #T 
(
    MileageFrom INT, 
    MileageTo INT 
) 

WHILE (@i <=50000) 
BEGIN 
    INSERT INTO #T 
    values(@i, @i+2000) 

    SET @i= @i+2000 
END 

SELECT 
    A.MileageTo, 
    SUM(January) as january, 
    SUM(Feburary) as Feb ...., 
    SUM(DEC) as DEC 
FROM YourTable A 
JOIN #T B ON A.Mileage BETWEEN B.MileageFrom and B.MileageTo 

你只是需要調整了一下MileageFrom值包括所有值小於-2000

+0

你爲什麼不縮進你的代碼?另外,在SQL中使用循環並不是一個好主意 - SQL是關於設置不循環的。 – Hogan

+0

感謝@Hogan對縮進代碼有價值的建議..關於循環..我相信你的例子也有遞歸CTE格式的循環.. maby是你的一個更好的方式獲得所需的輸出。 :) – Mahendra

+0

然後你相信錯了,遞歸CTE不是一個循環。你可以告訴,因爲你有一個'WHILE'關鍵字 - 這是你如何在SQL中創建一個循環。 – Hogan