Tried this but it shows DECADE column and every row is NULL.
SELECT ReleaseDate, COUNT (Title),
CASE
WHEN ReleaseDate BETWEEN 2010 AND 2019 THEN '2010 - 2019'
WHEN ReleaseDate BETWEEN 2000 AND 2009 THEN '2000 - 2009'
WHEN ReleaseDate BETWEEN 1990 AND 1999 THEN '1990 - 1999'
WHEN ReleaseDate BETWEEN 1980 AND 1989 THEN '1980 - 1989'
WHEN ReleaseDate BETWEEN 1970 AND 1979 THEN '1970 - 1979'
WHEN ReleaseDate BETWEEN 1960 AND 1969 THEN '1960 - 1969'
END AS DECADE
FROM Film
GROUP BY ReleaseDate
CodePudding user response:
You can get the decade with an integer division. So, not CASE statement is required, but you must GROUP BY decades
SELECT
CONVERT(nvarchar(3), YEAR(ReleaseDate) / 10) '0 - '
CONVERT(nvarchar(3), YEAR(ReleaseDate) / 10) '9' AS Decade,
Count(*) AS [Count]
FROM Film
GROUP BY YEAR(ReleaseDate) / 10
ORDER BY YEAR(ReleaseDate) / 10
I assume that ReleaseDate has a date or datetime type.
The result will be something like this:
| Decade | Count |
|---|---|
| 1990 - 1999 | 14 |
| 2000 - 2009 | 17 |
| 2010 - 2019 | 23 |
| 2020 - 2029 | 3 |
Example: If the date is 2012-08-17, then YEAR(ReleaseDate) is 2012, 2012 / 10 is 201. We convert it to a nvarchar(3) -> '201' and add the string '0 - ' which gives '2010 - '. Then we do the same again but add '9' instead to get 2019. Result: '2010 - 2019'.
The advantage of this approach is that you get automatically all the decades stored in your db. When a new decade starts, you get it automatically without have to complement your CASE expression.
CodePudding user response:
Actually you may want to use a CROSS APPLY so that you can reference the alias
FYI - Technically the decade begins 2001
Example
SELECT B.Decade
,COUNT(*),
FROM Film A
CROSS APPLY ( values (
CASE WHEN year(ReleaseDate) BETWEEN 2010 AND 2019 THEN '2010 - 2019'
WHEN year(ReleaseDate) BETWEEN 2000 AND 2009 THEN '2000 - 2009'
WHEN Year(ReleaseDate) BETWEEN 1990 AND 1999 THEN '1990 - 1999'
WHEN year(ReleaseDate) BETWEEN 1980 AND 1989 THEN '1980 - 1989'
WHEN year(ReleaseDate) BETWEEN 1970 AND 1979 THEN '1970 - 1979'
WHEN year(ReleaseDate) BETWEEN 1960 AND 1969 THEN '1960 - 1969'
END
)
) B(Decade)
GROUP BY B.Decade
CodePudding user response:
I am guessing the issue might be in the format of timestamp, try using YEAR() on ReleaseDate like so
CASE
WHEN YEAR(ReleaseDate) BETWEEN 2010 AND 2019 THEN '2010 - 2019'
...
...
END
CodePudding user response:
ReleaseDate seems to be a date, in which case you can use date ranges:
SELECT ReleaseDate, COUNT (Title),
CASE
WHEN ReleaseDate BETWEEN '2010-01-01 00:00:00' AND '2019-01-01 00:00:00' THEN '2010 - 2019'
WHEN ReleaseDate BETWEEN '2000-01-01 00:00:00' AND '2009-01-01 00:00:00' THEN '2000 - 2009'
WHEN ReleaseDate BETWEEN '1990-01-01 00:00:00' AND '1999-01-01 00:00:00' THEN '1990 - 1999'
WHEN ReleaseDate BETWEEN '1980-01-01 00:00:00' AND '1989-01-01 00:00:00' THEN '1980 - 1989'
WHEN ReleaseDate BETWEEN '1970-01-01 00:00:00' AND '1979-01-01 00:00:00' THEN '1970 - 1979'
WHEN ReleaseDate BETWEEN '1960-01-01 00:00:00' AND '1969-01-01 00:00:00' THEN '1960 - 1969'
END AS DECADE
FROM Film
GROUP BY ReleaseDate
