Sql server 从另一列获取最大值

Sql server 从另一列获取最大值,sql-server,Sql Server,我想获得历史数据和生产数据。我的存储过程如下所示: ALTER PROCEDURE [dbo].[pCaRptACInactivas]( @CodAsesor VARCHAR(15), @CodOficina VARCHAR(4)) AS SET NOCOUNT ON DECLARE @CodArbolConta VARCHAR(25) IF @CodOfici

我想获得历史数据和生产数据。我的存储过程如下所示:

ALTER PROCEDURE [dbo].[pCaRptACInactivas](
                    @CodAsesor      VARCHAR(15),
                    @CodOficina     VARCHAR(4))

    AS
    SET NOCOUNT ON

    DECLARE @CodArbolConta VARCHAR(25)

    IF @CodOficina = '%'
        SET @CodArbolConta = '%'
    ELSE
        SELECT @CodArbolConta = CodArbolConta + '%'     FROM   tClOficinas  WHERE  CodOficina LIKE @CodOficina

    SELECT 
        tabACInactivas.CodOficina, 
        tabACInactivas.NomOficina,
        tabACInactivas.NomAsesor,
        MAX(tabACInactivas.CodPrestamo) CodPrestamo,
        tabACInactivas.CodAsociacion,
        tabACInactivas.NombreAsociacion,
        MAX(tabACInactivas.Ciclo) AS Ciclo,
        COUNT(DISTINCT tabACInactivas.CodUsuario) AS CantSocias,
        MAX(tabACInactivas.FechaEstado) AS FechaCancelacion--,

    FROM (      SELECT          tClOficinas.CodOficina,             tClOficinas.NomOficina,             tCaClAsesores.CodAsesor,                        tCaClAsesores.NomAsesor,            tCaPrestamos.CodPrestamo,           tCaAsociacion.CodAsociacion,            tCaAsociacion.NombreAsociacion,             tCaPrestamos.Ciclo,             tCaPrCliente.CodUsuario,            tCaPrestamos.FechaEstado,           tClParametros.FechaProceso      FROM            tCaPrestamos WITH(NOLOCK)           INNER JOIN tCaProducto WITH(NOLOCK) ON tCaProducto.CodProducto = tCaPrestamos.CodProducto           INNER JOIN tClOficinas WITH(NOLOCK) ON tClOficinas.CodOficina = tCaPrestamos.CodOficina             INNER JOIN tCaAsociacion WITH(NOLOCK) ON tCaAsociacion.CodAsociacion = tCaPrestamos.CodAsociacion           INNER JOIN tCaPrCliente WITH(NOLOCK) ON tCaPrCliente.CodPrestamo = tCaPrestamos.CodPrestamo             INNER JOIN tClParametros WITH(NOLOCK) ON tClParametros.CodOficina = tClOficinas.CodOficina          INNER JOIN tCaClAsesores ON tCaClAsesores.CodAsesor = tCaAsociacion.CodAsesor       WHERE           tCaPrestamos.Estado = 'CANCELADO'           AND DATEDIFF(DAY, tCaPrestamos.FechaEstado, tClParametros.FechaProceso) > 30            AND NOT EXISTS(SELECT 1 
                           FROM tCaPrestamos Pr 
                           INNER JOIN tCaPrCliente PrCl ON PrCl.CodPrestamo = Pr.CodPrestamo
                           WHERE Pr.Estado NOT IN ('TRAMITE', 'APROBADO') 
                           AND Pr.FechaDesembolso >= tCaPrestamos.FechaEstado 
                           AND Pr.CodAsociacion = tCaPrestamos.CodAsociacion
                          )             AND tCaProducto.Tecnologia = 3          AND tCaPrestamos.CodAsesor LIKE @CodAsesor              AND tCaPrestamos.CodOficina IN (SELECT CodOficina FROM tClOficinas WHERE CodArbolConta LIKE @CodArbolConta)

        UNION ALL

        SELECT          tClOficinas.CodOficina,             tClOficinas.NomOficina,             tCaClAsesores.CodAsesor,            tCaClAsesores.NomAsesor,            tCaHPrestamos.CodPrestamo,          tCaAsociacion.CodAsociacion,            tCaAsociacion.NombreAsociacion,             tCaHPrestamos.Ciclo,            tCaHPrCliente.CodUsuario,           tCaHPrestamos.FechaEstado,          tClParametros.FechaProceso          FROM            tCaHPrestamos WITH(NOLOCK)          INNER JOIN tCaProducto WITH(NOLOCK) ON tCaProducto.CodProducto = tCaHPrestamos.CodProducto          INNER JOIN tClOficinas WITH(NOLOCK) ON tClOficinas.CodOficina = tCaHPrestamos.CodOficina            INNER JOIN tCaAsociacion WITH(NOLOCK) ON tCaAsociacion.CodAsociacion = tCaHPrestamos.CodAsociacion          INNER JOIN tCaHPrCliente WITH(NOLOCK) ON tCaHPrCliente.CodPrestamo = tCaHPrestamos.CodPrestamo          INNER JOIN tClParametros WITH(NOLOCK) ON tClParametros.CodOficina = tClOficinas.CodOficina          INNER JOIN tCaClAsesores ON tCaClAsesores.CodAsesor = tCaAsociacion.CodAsesor       WHERE           tCaHPrestamos.Estado = 'CANCELADO'          AND DATEDIFF(DAY, tCaHPrestamos.FechaEstado, tClParametros.FechaProceso) > 30           AND NOT EXISTS(SELECT 1 
                           FROM tCaHPrestamos Pr 
                           INNER JOIN tCaHPrCliente PrCl ON PrCl.CodPrestamo = Pr.CodPrestamo
                           WHERE Pr.Estado NOT IN ('TRAMITE', 'APROBADO') 
                           AND Pr.FechaDesembolso >= tCaHPrestamos.FechaEstado 
                           AND Pr.CodAsociacion = tCaHPrestamos.CodAsociacion
                          )             AND tCaProducto.Tecnologia = 3          AND tCaHPrestamos.CodAsesor LIKE @CodAsesor             AND tCaHPrestamos.CodOficina    IN (SELECT CodOficina FROM tClOficinas WHERE CodArbolConta LIKE @CodArbolConta)


    )tabACInactivas 
    GROUP BY            tabACInactivas.CodAsociacion,           tabACInactivas.NombreAsociacion,            tabACInactivas.NomOficina,          tabACInactivas.CodOficina,          tabACInactivas.NomAsesor

我希望CantSocias列能够最大限度地利用Ciclo列的价值,但不起作用

您发布的存储过程太大、太块状,甚至无法尝试解释和理解。所以我将结束你最后一句话:

我想CantSocias列取Ciclo列的最大值, 但不起作用

基本上,如果要将特定列设置为该列,可以执行以下操作:

update YourTable
set CantSocias = 
(
  select max(Ciclo)
  from YourOtherTable
)
-- here is where you can put a conditional WHERE clause

您可能需要创建一个子查询以获得Ciclo的最大值,并将其连接回您的查询。 我的意思的一个例子是:

create table #Product
(
    ID int,
    ProductName varchar(20)
)

insert into #Product(ID, ProductName)
    select 1,'ProductOne'
    union
    select 2,'ProductTwo'

create table #ProductSale
(
    ProductID int,
    Number int,
    SalesRegion varchar(20)
)

insert into #ProductSale(ProductID,Number,SalesRegion)
    select 1,1500,'North'
    union
    select 1, 1200, 'South'
    union
    select 2,2500,'North'
    union
    select 2, 3200, 'South'

--select product sales region with the most sales
select * from #Product p

select ProductId, Max(Number) as Bestsale   from #ProductSale ps group by ProductID

--combining
select 
    p.ID,
    p.ProductName,
    tp.Bestsale,
    ps.SalesRegion
from
    #Product p 
inner join
    (select ProductId, Max(Number) as Bestsale   from #ProductSale ps group by ProductID) as tp on p.ID = tp.ProductID
inner join
    #ProductSale ps on p.ID = ps.ProductID and tp.Bestsale = ps.Number

建议从问题中删除存储的进程。编辑以包括表的架构、示例数据和示例输出。这个存储过程不可能对帮助您的人有用——它太复杂了,无法从根本上解决您的实际问题。用最基本的要素重新表述你的问题。同时,更清楚什么不起作用。你没有得到你期望的值,是不是出错了?