根据已分组的视图中的查询进行分组

时间:2014-09-17 10:19:53

标签: sql sql-server group-by sql-view

一个简单的问题,是否可以从视图中选择一个组? 场景:我有一个视图,它给我生成,nº,生物量,平均重量和日期。我想分组这个选择

    select * from View where date => my_date and date <= my_date

我尝试过像

这样的东西
   select generation, nº, biomass, av.weight from select * from View where date => my_date and date <= my_date group by generation

但它似乎不起作用......:/

当然我可以进行查询,然后处理Java代码上的结果,但如果能直接从SQL中检索我想要的内容会更好。

提前致谢。

问候。

编辑:由于我的问题有点令人困惑,我会尝试重新制定它。我创建了一个视图:

    SELECT        TOP (100) PERCENT dbo.Generacion.descgeneracion,      SUM(dbo.MovimientosEstanque.numeroindividuos) AS numeroindividuos, 
                     SUM(dbo.MovimientosEstanque.pesomedio * dbo.MovimientosEstanque.numeroindividuos / 1000) AS biomasa, 
                     SUM(dbo.MovimientosEstanque.pesomedio * dbo.MovimientosEstanque.numeroindividuos / 1000) * 1000 / SUM(dbo.MovimientosEstanque.numeroindividuos) AS pesomedio, dbo.MovimientosEstanque.fechamovimiento AS fecha, dbo.LoteDePlanta.codigoplanta FROM            dbo.MovimientosEstanque INNER JOIN
                     dbo.CicloProductivo ON dbo.CicloProductivo.codigociclo = dbo.MovimientosEstanque.codigocicloorigen INNER JOIN
                     dbo.LoteDePlanta ON dbo.CicloProductivo.idloteplanta = dbo.LoteDePlanta.idloteplanta INNER JOIN  dbo.Generacion ON dbo.Generacion.idgeneracion = dbo.LoteDePlanta.idgeneracion WHERE        (dbo.MovimientosEstanque.idtipomovimiento = 'SAL') GROUP BY dbo.Generacion.descgeneracion, dbo.MovimientosEstanque.fechamovimiento, dbo.LoteDePlanta.codigoplanta ORDER BY dbo.Generacion.descgeneracion

现在,用户将输入一系列日期(例如20140707和20140709),我必须显示那些日子按代数分组的“numeroindividuos”,“biomasa”和“pesomedio”。例如,当我执行时:

select descgeneracion, numeroindividuos, biomasa, pesomedio, fecha from VistaDespesquesGeneraciones where fecha  >= '20140707' and fecha <= '20140710' 

我明白了:

descgeneracion           numeroindividuos biomasa                pesomedio              fecha
14 4                    76189            892422                 11713,2656945228       2014-07-07 00:00:00.000
14 4                     39410            80172079               2034308,01826947       2014-07-08 00:00:00.000
14 4                     1410             115476                 81897,8723404255       2014-07-10 00:00:00.000

现在我想按代将这些结果分组,这样我就可以得到像

这样的东西
descgeneration numeroindividuos       biomasa       pesomedio
14 4           SUM(numeroindividuos) SUM(biomasa) SUM(pesomedio)

我试过

select descgeneracion, sum(numeroindividuos), sum(biomasa), sum(pesomedio) from select * from VistaDespesquesGeneraciones where fecha >= '20140707' and fecha <= '20140709' group by descgeneracion

select descgeneracion, sum(numeroindividuos), sum(biomasa), sum(pesomedio) from [select * from VistaDespesquesGeneraciones where fecha >= '20140707' and fecha <= '20140709'] group by descgeneracion

他们都没有工作,sintax错误第一种情况和对象名称在第二种情况下无效。

对不起有误。

2 个答案:

答案 0 :(得分:0)

下次尝试发布您获得的错误,通常会有帮助。

避免使用select *帮助了解架构。

由于我不知道这些领域,我将不得不承担。

select generation, COUNT(*) [nº], SUM(weight) [biomass], AVG(weight) [av.weight] from (select * from View where date => my_date and date <= my_date) t group by generation

使用group by,group by子句中未包含的其他字段必须受某种Aggregate Functions

的影响

答案 1 :(得分:0)

您是否尝试将子查询放在括号中的视图上。这样它将被视为自己的表。作为使用上述代码的示例;

 select a.generation, count(*) as [nº], a.biomass, a.weight from (select generation, <uniquekey>, biomass, weight from View where date => my_date and date <= my_date) a group by a.generation, a.biomass, a.weight

或者在不使用子查询的情况下执行此操作(这可能会返回稍快的结果)

select generation, count(*) as [nº], biomass, weight from View where date => my_date and date <= my_date group by generation, biomass, weight

虽然需要包括计数,最大值,最小值计算的任何值,因此您需要决定如何计算重量和生物量(最小值,最大值,平均值)。以mxix的答案为例。

编辑:与上面的新示例代码相同的理论。

select a.descgeneracion, sum(a.numeroindividuos), sum(a.biomasa), sum(a.pesomedio) from (select descgeneracion, numeroindividuos, biomasa, pesomedio from VistaDespesquesGeneraciones where fecha >= '20140707' and fecha <= '20140709') a group by a.descgeneracion