Order a query with two keys

  • Hi, I am trying to order a query by two keys. The query is built with several subqueries. The table contains, beside columns with other data, two columns, Key and Key_Father. So I need to order the results since SQL to print the results in a report. This is an example:

    Key Key_Father

    4 NULL

    1 4

    2 4

    7 NULL

    1 7

    2 7

    As you can see is a structure father-son, where a row is a father if the Key_Father is NULL and the Key column start from one for each son with a different father.

    The first subquery gives the data in order, because is stored on that order in the table, but the second subquery that uses a group by, no. So I tried adding a extra column with Row_Number on the first subquery to keep that order, but the second subquery does the same thing.

    This is the query:

    SELECT Orden,INV_Key,Key_Padre,INV.INV_ID,INV.BOD_Bodega_ID,

    CASE WHEN MAX(HIS_Ventas) > 0 OR max(HIS_Disponible) > 0 THEN 1 ELSE 0 END AS Participacion,MAX(ISNULL(HIS_Ventas,0)) AS Ventas

    FROM(SELECT ROW_NUMBER() OVER (ORDER BY C.INV_Compra_ID) Orden,C.BOD_Bodega_ID,INV_Key,Key_Padre,CD.INV_ID

    FROM dbo.INV_COMPRAS_USADOS C

    INNER JOIN dbo.INV_COMPRAS_USADOS_DET CD ON C.INV_Compra_ID = CD.INV_Compra_ID

    WHERE C.INV_Compra_ID = @Compra_ID

    AND ((Key_Padre IS NULL AND CD.INV_Catalogo_Codigo = ISNULL(@Cod_Catalogo,CD.INV_Catalogo_Codigo)

    AND INV_Key IN (SELECT DISTINCT Key_Padre

    FROM dbo.INV_COMPRAS_USADOS_DET

    WHERE INV_Compra_ID = @Compra_ID AND Key_Padre IS NOT NULL))

    OR Key_Padre IN (SELECT DISTINCT INV_Key

    FROM dbo.INV_COMPRAS_USADOS_DET

    WHERE INV_Compra_ID = @Compra_ID AND (Key_Padre IS NULL AND CD.INV_Catalogo_Codigo = ISNULL(@Cod_Catalogo,CD.INV_Catalogo_Codigo))))) INV

    LEFT JOIN DBO.HIS_HISTORICO_DETALLE HD ON INV.INV_ID = HD.INV_ID AND HD.BOD_Bodega_ID = INV.BOD_Bodega_ID

    LEFT JOIN DBO.HIS_HISTORICO_INVENTARIO H on H.HIS_Historico_ID= HD.HIS_Historico_ID AND (CONVERT(datetime,(convert(varchar(20),HIS_Historico_Ano) + '/' + convert(varchar(20),HIS_Historico_Mes) + '/01')) BETWEEN @FechaDesde AND @FechaHasta)

    WHERE H.HIS_Historico_Mes IS NOT NULL OR INV.INV_ID IS NULL

    GROUP BY Orden,INV_Key,Key_Padre,INV.INV_ID,INV.BOD_Bodega_ID,HIS_Historico_Ano,HIS_Historico_Mes

    Another interesting thing (well for me) is that when I change the @Variables for Constant values, the second query keeps the correct order, even when the constant values are the same that the @variables. This is just a portion of the total query, is a subquery that needs of another two selects, and I need to keep the order from those selects too.

    So I hope that someone could help me with this. Thanks!

  • It would help if yo could post the DDL (CREATE TABLE statement(s)) for the table(s) involved, provide sample data (as a series of INSERT INTO statements) for the tables involved, and th expected results based on the sample data.

    If you do that, I'm sure you will get the help youare looking for with this problem, in addition you will get tested code in return for your additional effort.

    For moe n his, please read the first article I have referenced below in my signature block.

Viewing 2 posts - 1 through 1 (of 1 total)

You must be logged in to reply to this topic. Login to reply