如何在单列中获取月份和年份并对所有年份和月份的数据进行分组?

时间:2011-01-10 10:33:41

标签: sql sql-server-2005

对于以下查询(sdate是列名,表名是storedata)

Collapse
WITH TotalMonths AS (SELECT T1.[Month], T2.[Year]
 FROM ((SELECT DISTINCT Number AS [Month]
FROM MASTER.dbo.spt_values WHERE [Type] = 'p' AND Number BETWEEN 1 AND 12) T1 CROSS JOIN
 (SELECT DISTINCT DATEPART(year, sdate) AS [Year]
FROM storedata) T2))

SELECT CTE.[Year], CTE.[Month], ISNULL(T3.[Sum], 0) areasum
FROM TotalMonths CTE LEFT OUTER JOIN (
SELECT SUM(areasft) [Sum], DATEPART(YEAR, sdate) [Year], DATEPART(MONTH, sdate) [Month]
FROM storedata
GROUP BY DATEPART(YEAR, sdate) ,DATEPART(MONTH, sdate)) T3
ON CTE.[Year] = T3.[Year] AND CTE.[Month] = T3.[Month] WHERE CTE.[Year]>'2007'
ORDER BY CTE.[Year], CTE.[Month]

我得到的结果如下所示。

YEAR MONTH AREASUM
2008    1   0
2008    2   1193
2008    3   4230
2008    4   350
2008    5   2200
2008    6   4660
2008    7   0
2008    8   6685
2008    9   0
2008    10  3051
2008    11  7795
2008    12  2940
2009    1   1650
2009    2   3235
2009    3   2850
2009    4   6894
2009    5   3800
2009    6   2250
2009    7   1000
2009    8   1800
2009    9   1550
2009    10  2350
2009    11  0
2009    12  1800

但是我必须在单列中结合月份和年份。 reult集应该如下。

JAN/08   O
FEB/08 1193
.. ..
.. ..
DEC/O9 1800

如何修改查询? (即使一个月没有区域,我也要显示所有年份和月份)

此致

N.SRIRAM

2 个答案:

答案 0 :(得分:1)

尝试:

SELECT CONVERT(VARCHAR(3), DATENAME(MONTH, CTE.Month), 7) + '/' + RIGHT(CTE.Year, 2)

而不是使用SELECT中的前2列。

答案 1 :(得分:0)

您似乎在说您从原始查询中获取了正确的数据,但格式错误。所以

  1. 根据您最初发布的查询制作视图。
  2. 根据该视图构建SELECT查询,为您提供所需的格式。
  3. 让我们说你这样做:

    CREATE VIEW wibble AS <your original query goes here>
    

    然后您可以查询wibble来更正格式。

    select 
    case
        when month = 1 then 'Jan/'
        when month = 2 then 'Feb/'
        when month = 3 then 'Mar/'
        when month = 4 then 'Apr/'
        when month = 5 then 'May/'
        when month = 6 then 'Jun/'
        when month = 7 then 'Jul/'
        when month = 8 then 'Aug/'
        when month = 9 then 'Sep/'
        when month = 10 then 'Oct/'
        when month = 11 then 'Nov/'
        when month = 12 then 'Dec/'
        else 'Err'
    end || substring(cast(year as CHAR(4)), 3, 2) as yearmonth,
    areasum from wibble;