SELECT  CAST(s.Year AS VARCHAR) +'年'+
        CAST(s.Month AS VARCHAR)+'月',
        tmp.quarter
FROM    dbo.s_SalesBudget s INNER JOIN dbo.p_tmp tmp ON s.Month=tmp.month
WHERE   YEAR = '2009'
GROUP BY s.Month,YEAR,tmp.quarter
with rollup
ORDER BY s.Month 

解决方案 »

  1.   

    SELECT  CASE WHEN GROUPING(CAST(tmp.quarter AS varchar)) <> 1 THEN 0
                 ELSE CAST(s.Year AS VARCHAR) + '年' + CAST(s.Month AS VARCHAR)
                      + '月'
            END ,
            tmp.quarter
    FROM    dbo.s_SalesBudget s
            INNER JOIN dbo.p_tmp tmp ON s.Month = tmp.month
    WHERE   YEAR = '2009'
    GROUP BY s.Month ,
            YEAR ,
            tmp.quarter
            WITH ROLLUP
    ORDER BY s.Month 
    这样写报错:
    消息 8161,级别 16,状态 1,第 1 行
    GROUPING 函数的参数 1 与 GROUP BY 子句中的任何表达式都不匹配。
    各位帮我看下什么原因
      

  2.   


    改成这样试试:
    SELECT  CASE WHEN GROUPING(tmp.quarter)  <> 1 THEN '0'
                 ELSE CAST(s.Year AS VARCHAR) + '年' + CAST(s.Month AS VARCHAR)
                      + '月'
            END ,
            tmp.quarter
    FROM    dbo.s_SalesBudget s
            INNER JOIN dbo.p_tmp tmp ON s.Month = tmp.month
    WHERE   YEAR = '2009'
    GROUP BY s.Month ,
            YEAR ,
            tmp.quarter
            WITH ROLLUP
    ORDER BY s.Month 
      

  3.   


    改成这样试试:
    SELECT  CASE WHEN GROUPING(tmp.quarter)  <> 1 THEN '0'
                 ELSE CAST(s.Year AS VARCHAR) + '年' + CAST(s.Month AS VARCHAR)
                      + '月'
            END ,
            tmp.quarter
    FROM    dbo.s_SalesBudget s
            INNER JOIN dbo.p_tmp tmp ON s.Month = tmp.month
    WHERE   YEAR = '2009'
    GROUP BY s.Month ,
            YEAR ,
            tmp.quarter
            WITH ROLLUP
    ORDER BY s.Month 
    不报错了,但显示的方式不是想要的呀
    小计 NULL
    2009年1月 1
    小计 NULL
    小计 NULL
    2009年2月 1
    小计 NULL
    小计 NULL
    2009年3月 1
    小计 NULL
    小计 NULL
    2009年4月 2
    小计 NULL
    小计 NULL
    2009年5月 2
    小计 NULL
    小计 NULL
    2009年6月 2
    小计 NULL
    小计 NULL
    2009年7月 3
    小计 NULL
    小计 NULL
    2009年8月 3
    小计 NULL
    小计 NULL
    2009年9月 3
    小计 NULL
    小计 NULL
    2009年10月 4
    小计 NULL
    小计 NULL
    2009年11月 4
    小计 NULL
    小计 NULL
    2009年12月 4
    小计 NULL
    小计 NULL
    如果=1的话就是这样
    NULL NULL
    小计 1
    2009年1月 NULL
    NULL NULL
    小计 1
    2009年2月 NULL
    NULL NULL
    小计 1
    2009年3月 NULL
    NULL NULL
    小计 2
    2009年4月 NULL
    NULL NULL
    小计 2
    2009年5月 NULL
    NULL NULL
    小计 2
    2009年6月 NULL
    NULL NULL
    小计 3
    2009年7月 NULL
    NULL NULL
    小计 3
    2009年8月 NULL
    NULL NULL
    小计 3
    2009年9月 NULL
    NULL NULL
    小计 4
    2009年10月 NULL
    NULL NULL
    小计 4
    2009年11月 NULL
    NULL NULL
    小计 4
    2009年12月 NULL
    NULL NULL
      

  4.   

    对了,你是想显示2列,一列是年月,一列是季度,然后再是季度的小计,比如这样:年月      季度
    2013年1月 1
    2013年2月 1
    2013年3月 1
     null     1
    是这样吗
      

  5.   

    时   间2009年1月
    2009年2月
    2009年3月
    一季度汇总
    2009年4月
    2009年5月
    2009年6月
    二季度汇总
    2009年7月
    2009年8月
    2009年9月
    三季度汇总
    2009年10月
    2009年11月
    2009年12月
    四季度汇总
    2009年汇总
    想要这种格式的,不知道怎么写试试这个:
    SELECT  CASE WHEN GROUPING(tmp.quarter)  <> 1 THEN CAST(tmp.quarter as varchar)+'季度小计'
                 ELSE CAST(s.Year AS VARCHAR) + '年' + CAST(s.Month AS VARCHAR)
                      + '月'
            END ,
            tmp.quarter
    FROM    dbo.s_SalesBudget s
            INNER JOIN dbo.p_tmp tmp ON s.Month = tmp.month
    WHERE   YEAR = '2009'
    GROUP BY 
            YEAR ,
            tmp.quarter,s.Month 
            WITH ROLLUP
    having GROUPING(year) = 0
    ORDER BY s.Month 
      

  6.   

    时   间2009年1月
    2009年2月
    2009年3月
    一季度汇总
    2009年4月
    2009年5月
    2009年6月
    二季度汇总
    2009年7月
    2009年8月
    2009年9月
    三季度汇总
    2009年10月
    2009年11月
    2009年12月
    四季度汇总
    2009年汇总
    想要这种格式的,不知道怎么写试试这个:
    SELECT  CASE WHEN GROUPING(tmp.quarter)  <> 1 THEN CAST(tmp.quarter as varchar)+'季度小计'
                 ELSE CAST(s.Year AS VARCHAR) + '年' + CAST(s.Month AS VARCHAR)
                      + '月'
            END ,
            tmp.quarter
    FROM    dbo.s_SalesBudget s
            INNER JOIN dbo.p_tmp tmp ON s.Month = tmp.month
    WHERE   YEAR = '2009'
    GROUP BY 
            YEAR ,
            tmp.quarter,s.Month 
            WITH ROLLUP
    having GROUPING(year) = 0
    ORDER BY s.Month 
    把ORDER 那去掉就行了,大神啊,告诉我,为什么这句可以吗?我想知道原理
      

  7.   

    时   间2009年1月
    2009年2月
    2009年3月
    一季度汇总
    2009年4月
    2009年5月
    2009年6月
    二季度汇总
    2009年7月
    2009年8月
    2009年9月
    三季度汇总
    2009年10月
    2009年11月
    2009年12月
    四季度汇总
    2009年汇总
    想要这种格式的,不知道怎么写试试这个:
    SELECT  CASE WHEN GROUPING(tmp.quarter)  <> 1 THEN CAST(tmp.quarter as varchar)+'季度小计'
                 ELSE CAST(s.Year AS VARCHAR) + '年' + CAST(s.Month AS VARCHAR)
                      + '月'
            END ,
            tmp.quarter
    FROM    dbo.s_SalesBudget s
            INNER JOIN dbo.p_tmp tmp ON s.Month = tmp.month
    WHERE   YEAR = '2009'
    GROUP BY 
            YEAR ,
            tmp.quarter,s.Month 
            WITH ROLLUP
    having GROUPING(year) = 0
    ORDER BY s.Month 
    把ORDER 那去掉就行了,大神啊,告诉我,为什么这句可以吗?我想知道原理哦 ,1.你用了rollup之后,一定注意group by中字段的顺序,我上面改了一下,把年,季度放在了前面,月放在最后,这样月就只有明细的数据,而从年开始到季度,会有小计2.由于你不需要年的小计,所以 加了 having GROUPING(year) = 0 也就是过滤掉年的小计数据。