2012-10-26 88 views
2

我想sumarise中的數據,並且很難找到用於分組數據的方法。將數據總結爲年份範圍

我有一個表,名爲汽車

CarID CarMake CarModel CarYear 
1  Ford  Mondeo 2000 
2  Ford  Mondeo 2002 
3  Ford  Mondeo 2003 
4  Ford  Mondeo 2005 

我希望能集團這一數據顯示爲

CarMake CarModel CarYearRange 
Ford  Mondeo 2000-2003 
Ford  Mondeo 2005-2005 

我一直在使用的最小和最大生產這種然而,這失敗如果嘗試例如,這輛車不是在一年之間製造的。

+3

您如何確定年份範圍? – RichardTheKiwi

回答

2
select carmake, carmodel, 
case when caryear >= 2000 and caryear <=2003 then '2000-2003' 
    when caryear >= 2005 and caryear <=2005 then '2005-2005' 
end t 
from car 
group by carmake, carmodel , t 

fiddle demo

+2

你可以通過問題標籤檢查這是否適用於SQL-SERVER? – RichardTheKiwi

2

我假定(也許brashly),你的樣本數據中包含一個錯誤,該範圍應該是2000年,2002- 2003年,和2005年因爲有2001年或沒有模型2004年如果我是正確的,那麼這將工作:

WITH CTE AS 
( SELECT Cars.CarMake, 
      Cars.CarModel, 
      [FirstYear] = Cars.CarYear, 
      [LastYear] = Cars.CarYear, 
      [Recursion] = 1 
    FROM Cars 
    UNION ALL 
    SELECT CTE.CarMake, 
      CTE.CarModel, 
      CTE.[FirstYear], 
      [LastYear] = Cars.CarYear, 
      [Recursion] = [Recursion] + 1 
    FROM CTE 
      INNER JOIN Cars 
       ON CTE.CarMake = Cars.CarMake 
       AND CTE.CarModel = Cars.CarModel 
       AND CTE.[LastYear] = Cars.CarYear - 1 
), MaxCTE AS 
( SELECT CarMake, 
      CarModel, 
      FirstYear, 
      LastYear, 
      Recursion, 
      [MaxRecursion] = MAX(Recursion) OVER(PARTITION BY CarMake, CarModel, FirstYear) 
    FROM CTE 
) 
SELECT MaxCTE.CarMake, 
     MaxCTE.CarModel, 
     [CarYearRange] = CAST(FirstYear AS VARCHAR(4)) + ' - ' + CAST(LastYear AS VARCHAR(4)) 
FROM MaxCTE 
WHERE Recursion = MaxRecursion 
AND  NOT EXISTS 
     ( SELECT 1 
      FROM MaxCTE ex 
      WHERE MaxCTE.CarMake = ex.CarMake 
      AND  MaxCTE.CarModel = ex.CarModel 
      AND  MaxCTE.FirstYear > ex.FirstYear 
      AND  MaxCTE.LastYear = ex.LastYear 
     ) 

SQL Fiddle Example

編輯

如果我已經正確地解釋了要求,使用RICHARD的KIWI的答案。它比礦井好得多!

Fiddle for the improved solution

SELECT CarMake, 
     CarModel, 
     [StartYear] = MIN(CarYear), 
     [EndYear] = MAX(CarYear) 
FROM ( SELECT *, 
        [Offset] = CarYear - ROW_NUMBER() OVER (PARTITION BY CarMake, CarModel ORDER BY CarYear) 
      FROM Cars 
     ) x 
GROUP BY CarMake, CarModel, Offset 
ORDER BY CarMake, CarModel, StartYear 
2

在SQL Server中,可以使用類似於這樣:

select distinct carmake, 
    carmodel, 
    case 
    when caryear >= 2000 and caryear <= 2003 then '2000-2003' 
    when caryear >= 2005 and caryear <= 2005 then '2005-2005' 
    end CarYearRange 
from yourtable 

SQL Fiddle with Demo

1

從您的需求GarethD的解釋得到暗示,這裏是我的查詢來獲得所需的結果。我強烈建議將範圍顯示爲2個不同的列,並讓前端代碼合併它們以供顯示(如果需要)。

select carmake, 
     carmodel, 
     min(caryear) startyear, 
     max(caryear) endyear 
from (
    select *, 
     offset= caryear-row_number() over (partition by carmake, carmodel 
              order by caryear) 
    from cars 
) x 
group by carmake, carmodel, offset 
order by carmake, carmodel, startyear 
+0

+1比我的解決方案好得多。我曾經多次看到過的一個訣竅,並且多次被遺忘。希望這次能回憶我的記憶! – GarethD