2016-11-30 7 views
-1

に明確なトップ1列を取得します。私は、SQL Server 2014年のプロジェクトのためのストアドプロシージャを書いていますし、私はこのコードを持っているSQL Serverの

ALTER PROCEDURE FOF_MejorVendedor 
AS 
BEGIN 
    SELECT TOP 1 
     F.Nombre, Em.Nombre, (P.Precio * CA.Cantidad) as 'Ganancia' 
    FROM 
     dbo.FO_Carrito CA 
    JOIN 
     dbo.FO_Solicitud S on S.ID = CA.FK_SolicitudC 
    JOIN 
     dbo.FO_Recibo R ON R.FK_Solicitud = S.ID 
    JOIN 
     dbo.FO_Productos P ON P.ID = CA.FK_ProductosC 
    JOIN 
     dbo.FO_Cliente C ON C.ID = S.FK_Cliente 
    JOIN 
     dbo.FO_Estante E ON E.FK_Producto = P.ID 
    JOIN 
     dbo.FO_PasilloXDepartamento PD ON PD.FK_Estante = E.NumeroEstante 
    JOIN 
     dbo.FO_Encargado En ON En.ID = PD.FK_Encargado 
    JOIN 
     dbo.FO_Empleado Em ON Em.ID = En.FK_EmpleadoE 
    JOIN 
     dbo.FO_Departamento D ON D.ID = PD.FK_Departamento 
    JOIN 
     dbo.FO_Ferreteria F ON D.FK_Ferreteria = F.ID 
    JOIN 
     dbo.FO_EmpleadosXFerreteria EF ON EF.FK_Ferreterias = F.ID 
    GROUP BY 
     F.Nombre, Em.Nombre, (P.Precio * CA.Cantidad) 
    ORDER BY 
     Ganancia DESC 
END 

しかし、私は唯一の「Ganancia」のトップ1を取得していますが、私は列 "F.Nombre"のそれぞれの別個の値についてそれを取得したいと思います。どのようにしてクエリを変更できますか?

+1

トップ1を削除します。トップ1は1行だけを返します。あなたのグループは、行をセットにグループ化します。トップ1を削除すると、F.NombreとEm.Nombreの別個の行が返されます –

+0

すべてのテーブルでIDという名前の列の使用をやめることをお勧めします。これは作業に苦労するデザインパターンです。列名は、すべてのテーブルで同じままにする必要があります。 ProductIDは変更されません。そして列をFK_と命名するのは悪い考えです。それがもはや外部キーではない場合はどうなりますか?すべてのコードを更新するか、誤解を招くような名前の列を使用する必要があります。名前に使用法を組み込むことは、データベース設計にとっては良いアプローチではありません。 –

+0

はい、知っていますが、TOP 1を削除しても、「F.Nombre」の別のインスタンスでグループ化されません。 –

答えて

0

Top 1句を使用しているため、あなたはトップレコードを取得しています。

ので、それを削除して

Group by 

結果が異なるように表示されます。

関連する問題