2016-04-29 9 views
0

ここではヘルプが必要です。最後のGROUP BY句を確認してください。サブクエリを使用したグループ化

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は、次のエラーを取得:集計またはGROUP BY句のリストでグループのために使用される式でサブクエリを使用することはできません。

サブクエリ "(SELECT count(*)FROM#Temp2 TMP2 WHERE ST2.nro_viaje = TMP2.nro_viaje GROUP BY nro_viaje)"の結果でグループ化する必要があります。

提案がありますか?ありがとう。

+0

エイリアス 'cantidad'でGROUP BYを試しても問題が解決しない場合は、現在のメインクエリのサブクエリを使用してから最後のグループを適用する必要がありますエイリアス) –

+0

ええ、別名でグループ化しようとしました。あなたの提案を試してみてください –

答えて

0

エイリアスでGROUP BYを実行しようとしましたか?

GROUP BY Cantidad 
+0

ええ、それを試してみましたか? –

+0

group by句では、列エイリアスを使用できません。これは[論理処理命令](https://destinationdata.wordpress.com/2016/01/10/the-logical-processing-order-3/)の一貫性です。グループbyはselect句の前に処理されます。つまり、エイリアスはその時点で存在しません。代わりに、クエリをサブクエリに変換してから、必要なフィールドでグループ化することができます。または、CROSS APPLYを使用して、照会の前に必要なフィールドを生成することができます。 –

関連する問題