2016-04-29 10 views
0

Benötigen Sie Hilfe hier. Überprüfen Sie die letzte GROUP BY-Klausel.Gruppierung nach Unterabfragen

set nocount on 
--Creo variable de tabla sin duplicados 
Declare @Temp1 Table (nro_viaje nvarchar(255),cod_cliente nvarchar(255)) 
if object_id('tempdb..#Temp2') is not null 
Begin 
drop table #Temp2 
End 
if object_id('tempdb..#ProcesadosBrutos') is not null 
Begin 
drop table #ProcesadosBrutos 
End 


insert into @Temp1 (nro_viaje,cod_cliente) 
select distinct [nro_viaje],cod_cliente FROM [Test].[dbo].[Hoja1$] order by nro_viaje 
--Remuevo los viajes que fueron de un solo cliente 
Delete T 
From @Temp1 T 
JOIN (select nro_viaje, count(*) cant from @Temp1 group by nro_viaje having COUNT(*)=1) S on T.nro_viaje=S.nro_viaje 
--Numero los viajes para iterar 

select cod_cliente,nro_viaje, dense_rank()over (order by nro_viaje) as ViajeID into #Temp2 from @Temp1 

--Obtengo el menor viaje para comenzar a iterar 
Declare @ViajeID int 
Declare @ViajeIDMax int 
Select @ViajeID=Min(ViajeID) From #Temp2 
Select @ViajeIDMax=MAX(ViajeID) From #Temp2 

Create Table #ProcesadosBrutos (Cod_cliente nvarchar(255), Combinables nvarchar(4000), Cantidad nvarchar (255)) 

While @ViajeID<[email protected] --Itero por cada viaje 
Begin 

Insert into #ProcesadosBrutos (Cod_cliente,Combinables, Cantidad) 
SELECT DISTINCT ST2.cod_cliente , 
    SUBSTRING(
     (
      SELECT '-'+CONVERT(varchar,ST1.cod_cliente) AS [text()] 
      FROM #Temp2 ST1 
      WHERE 
       [email protected] 
        and ST1.viajeid = ST2.viajeid 
      and ST1.cod_cliente <> ST2.cod_cliente 
      ORDER BY ST1.cod_cliente 
      FOR XML PATH ('') 
     ), 2, 1000) COMBINABLES, 
     (SELECT count(*) FROM #Temp2 TMP2 WHERE ST2.nro_viaje = TMP2.nro_viaje GROUP BY nro_viaje) Cantidad 
FROM #Temp2 ST2 
where [email protected] --AND (SELECT count(*) FROM #Temp2 TMP2 WHERE ST2.nro_viaje = TMP2.nro_viaje GROUP BY nro_viaje) > 1 AND (SELECT count(*) FROM #Temp2 TMP2 WHERE ST2.nro_viaje = TMP2.nro_viaje GROUP BY nro_viaje) < 4 
group by (SELECT count(*) FROM #Temp2 TMP2 WHERE ST2.nro_viaje = TMP2.nro_viaje GROUP BY nro_viaje) 
ORDER BY ST2.cod_cliente 
--Aumento en 1 el viajeid para proxima iteracion 
     Set @[email protected]+1 
End 


Select distinct * from #ProcesadosBrutos order by Cod_cliente 

Im den folgenden Fehler erhalten: Kann nicht ein Aggregat oder eine Unterabfrage in einem Ausdruck für die Gruppe durch Liste einer GROUP BY-Klausel verwenden.

Ich muss nach den Ergebnissen der Unterabfrage gruppieren "(SELECT count (*) FROM # Temp2 TMP2 WO ST2.nro_viaje = TMP2.nro_viaje GROUP BY nro_viaje)".

Irgendwelche Vorschläge? Vielen Dank.

+0

Sie könnten versuchen, GROUP BY auf dem Alias ​​'cantidad' zu verwenden oder wenn das nicht funktioniert, müssen Sie eine Unterabfrage für Ihre aktuelle Hauptabfrage verwenden und dann die letzte Gruppe anwenden (dann wieder gegen die neue alias) –

+0

yup ich habe versucht, nach dem Alias ​​gruppieren. werde deinen Vorschlag ausprobieren –

Antwort

0

Haben Sie versucht, die GROUP BY mit Ihrem Alias ​​zu machen?

GROUP BY Cantidad 
+0

yup ich habe es versucht, funktioniert nicht –

+0

Sie können nicht einen Spaltenalias in der Gruppierung nach Klausel verwenden. Dies ist eine Folge der [logischen Verarbeitungsreihenfolge] (https://destinationdata.wordpress.com/2016/01/10/the-logical-processing-order-3/). Die Gruppe by wird vor der select-Klausel verarbeitet, was bedeutet, dass der Alias ​​an diesem Punkt nicht existiert. Stattdessen können Sie die Abfrage in eine Unterabfrage umwandeln und dann nach dem erforderlichen Feld gruppieren. Oder Sie könnten CROSS APPLY verwenden, um das erforderliche Feld früher in der Abfrage zu generieren. –

Verwandte Themen