禁用GROUP BY列

时间:2017-04-16 22:02:56

标签: sql sql-server tsql group-by

如果这是重复的话我很抱歉(很可能)。我花了很长时间搜索,无法找到问题的准确答案。

我已经构建了一个SQL函数(在MSSQL中),它返回按年,月或者按年分组的行,具体取决于参数:

  Error:
   14:     transitionName: string | ReactCSSTransitionGroupNames,
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ property `appear`. Property not found in. See lib: flow-typed/npm/react-addons-css-transition-group_v15.x.x.js:14
  153:           transitionName={{
                                 ^ object literal

这可以成功地按月或按年分组,这取决于我希望报告的发展方式。

但理想情况下,我希望选择让CREATE FUNCTION get_report (@grouping VARCHAR(30)) RETURNS TABLE AS RETURN ( SELECT YEAR(t.my_date) as my_year, CASE when @grouping = 'monthly' THEN MONTH(t.my_date) ELSE null END as my_month, count(t.row_id) as num_rows, round(avg(my_val),4) as avg_my_val FROM my_schema.my_info t GROUP BY year(t.my_date), CASE when @grouping = 'monthly' THEN month(t.my_date) ELSE null END ) 完全消除分组,只显示一个项目列表。我可能会试图强迫这个查询做太多,但可能不会。我尝试了类似@grouping = 'none'的内容,但这并不是我想要的,GROUP BY 0似乎太乱了。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

试试这个:

use tsql2012

create table dbo.test18
(
    year int not null,
    month int not null,
    value int
);

insert into dbo.test18
values (2017, 4, 250), (2017, 4, 150), (2017, 4, 660), (2017, 4, 1110), (2017, 3, 1250), (2017, 2, 2540), (2017, 3, 2500)

declare @a varchar(30) = 'none'

select * from (
    select grouping_id(year, month, value) as gr_id, year, month, sum(value) as sm
    from dbo.test18
    group by grouping sets((year), (month), (year, month), (year, month, value))
) t
where 
    gr_id < case when @a = 'none' then 1 else 999 end
    and gr_id > case when @a = 'none' then -1 else 0 end

答案 1 :(得分:1)

您不能参数化分组 - 类似地,您无法参数化查询结构(因为它将导致不同的执行计划无法缓存)。

有三种解决方案:

  1. 使用Dynamic-SQL(即在T-SQL中构建一个SQL字符串,这必须在sproc中,而不是UDF中。)
  2. 使用动态生成SQL的ORM(例如Linq-to-Entities或NHibernate等)
  3. 为非分组版本创建第二个UDF。