14 Replies Latest reply: Dec 1, 2010 4:17 AM by Paola Alcázar Lorenzo RSS

    Uso del group by

      La siguiente sentencia en SQL me funciona perfectamente, pero en qlikview no, y es que por lo que he comprobado el group by no funciona como en sql, al poner CodArticulo y CodComponente en el group by me salen todos los componentes que tiene ese artículo y yo sólo quiero quedarme con el componente de mayor cantidad, como puedo hacerlo?

       

      Load CodArticulo as CodigoArticulo,

      Max(CantidadCons) as PrimeraMatPrima,

      ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodArticulo) as NombreArticulo,

      CodigoComponente as CodComponente,

      ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodigoComponente) as NombreComponente

      resident LISTAMAT where TipoCoste='MAT PRIMA' group by CodArticulo,CodigoComponente;



       

       

        • Uso del group by
          fsimoes

           

          Try:

           

           


          Load
          *,
          ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodComponente) as NombreComponente
          Load
          CodArticulo as CodigoArticulo,
          Max(CantidadCons) as PrimeraMatPrima,
          ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodArticulo) as NombreArticulo,
          CodigoComponente as CodComponente
          resident LISTAMAT where TipoCoste='MAT PRIMA' group by CodArticulo,CodigoComponente;


            • Uso del group by
              fsimoes

              [quote user="Fábio Simões"]

              Load

              *,

              ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodComponente) as NombreComponente

              Load

              CodArticulo as CodigoArticulo,

              Max(CantidadCons) as PrimeraMatPrima,

              ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodArticulo) as NombreArticulo,

              CodigoComponente as CodComponente

              resident LISTAMAT where TipoCoste='MAT PRIMA' group by CodArticulo,CodigoComponente;

               

              Correcting:

               

              Load

              *,

              ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodComponente) as NombreComponente

              ;

              Load

              CodArticulo as CodigoArticulo,

              Max(CantidadCons) as PrimeraMatPrima,

              ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodArticulo) as NombreArticulo,

              CodigoComponente as CodComponente

              resident LISTAMAT where TipoCoste='MAT PRIMA'

              group by CodArticulo,CodigoComponente;



                • Uso del group by

                  No funciona Fábio sigue sin agruparme por el codArticulo, es que el gruop by debería ser excluyente, es decir, si agrupo por codArticulo y por CodigoComponente debería salirme una artículo con su componente que sea MAT PRIMA y que cumpla Max(CantidadCons) y sin embargo lo que me aparece es el artículo repetido tantas veces como componentes son MAT PRIMA, pero a la condición Max(CatidadCons) ni caso. Creo que la única solución va a ser hacerlo en SQL puro y duro volviendo a extraer los datos de la base de datos.

                  Muchas gracias de todas formas Fábio!!

                    • Uso del group by

                      Soy neófito en qlikview pero creo que si sólo necesitas el artículo con mayor cantidad creo que no necesitas la agrupación por CodigoComponente y esto debiera bastar:

                      Load CodArticulo as CodigoArticulo,

                      Max(CantidadCons) as PrimeraMatPrima,

                      ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodArticulo) as NombreArticulo

                      resident LISTAMAT where TipoCoste='MAT PRIMA' group by CodArticulo;

                      Si posteriormente necesitases el dato de CodigoComponente podrías hacer un inner join a la tabla LISTAMAT antes de hacer un drop table.

                      Saludos!

                      • Uso del group by

                        Hola, porque no pruebas esto

                         


                        Load
                        CodArticulo as CodigoArticulo,
                        NombreArticulo,
                        Max(CantidadCons) as PrimeraMatPrima,
                        group by
                        CodArticulo,
                        NombreArticulo
                        ;
                        Load
                        CodArticulo.
                        CantidadCons,
                        ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodArticulo) as NombreArticulo
                        resident LISTAMAT where TipoCoste='MAT PRIMA' ;


                        Tambien podrias haber probado agrupar por el applymap(), pero creo que seria un desgaste de recursos

                        Saludos

                          • Uso del group by

                            Es que tengo que agrupar también por código de componente, que en definitiva es lo que yo quiero, el componente que compone en mayor cantidad a un artículo. En SQL se hace fácilmente porque el group by es excluyente, pero por lo que he podido comprobar el group by de qlikview no.

                            Muchas gracias de todos modos Héctor!

                              • Uso del group by

                                Te pongo una hipótesis de datos:

                                NombreArticuloCodComponenteCantidadCons
                                AA110
                                AA120
                                AA130
                                AA240
                                AA250
                                BB160
                                BB170
                                BB280
                                BB290
                                BB210
                                CC11
                                CC12
                                CC23
                                CC24
                                CC15



                                Con este código:

                                TAB1:
                                Load NombreArticulo,
                                MAX(CantidadCons) as CantidadCons
                                FROM Datos.xls (biff, embedded labels, table is [Hoja1$])
                                GROUP BY NombreArticulo, CantidadCons;

                                INNER JOIN (TAB1)
                                LOAD MAX(CantidadCons) as CantidadCons,
                                NombreArticulo,
                                CodComponente
                                FROM Datos.xls (biff, embedded labels, table is [Hoja1$])
                                GROUP BY NombreArticulo, CodComponente;

                                Quedaría algo así:

                                NombreArticuloCodComponenteCantidadCons
                                AA130
                                AA250
                                BB170
                                BB290
                                CC15
                                CC24

                                Falta la parte de TipoCoste='MAT PRIMA' pero eso te lo dejo a ti, espero que por lo demás fuera eso lo que necesitabas, cada artículo y componente con la cantidad máxima en CantidadCons.

                                Saludos

                                 

                                  • Uso del group by

                                    Es que el problema es que lo que necesito es que cada artículo aparezca sólo una vez con su componente que lo compone en mayor cantidad, tendría que quedar así:

                                    A A2 50

                                    B B2 90

                                    C C1 5

                                    saludos!

                                      • Uso del group by

                                        He cambiado un poco el código que tu me has dicho y me ha funcionado por fin:

                                         

                                        Con este código:

                                        TAB1:

                                         

                                        Load CodArticulo as CodigoArticulo,

                                        Max(CantidadCons) as PrimeraMatPrima,

                                        ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodArticulo) as NombreArticulo

                                        resident LISTAMAT where TipoCoste='MAT PRIMA' group by CodArticulo;

                                         

                                        Inner Join (TAB1)

                                        Load Max(CantidadCons) as PrimeraMatPrima,

                                        CodArticulo as CodigoArticulo,

                                        CodigoComponente as CodComponente,

                                        ApplyMap('COMPONENTE', $(sIdEmp)&':'&CodigoComponente) as NombreComponente

                                        resident LISTAMAT where TipoCoste='MAT PRIMA' group by CodArticulo, CodigoComponente;



                                         

                                        Muchísimas gracias thefourth!!!



                                          • Uso del group by

                                            Que bueno! ya me alegra haberte servido de ayuda.

                                            Saludos

                                              • Uso del group by

                                                por cierto según el código que te puse, para conseguir justo lo que querías era reemplazar el INNER JOIN por:

                                                INNER JOIN (TAB1)
                                                LOAD MAX(CantidadCons) as CantidadCons,
                                                LASTVALUE(CodComponente) as CodComponente,
                                                NombreArticulo
                                                FROM Agrupamientos.xls (biff, embedded labels, table is [Hoja1$])
                                                GROUP BY NombreArticulo;

                                                Es decir, poner un LASTVALUE de CodComponente y quitarlo de la agrupación

                                                Saludos

                                                  • Uso del group by

                                                    Perdón, al final el código sería:

                                                    TAB1:
                                                    Load NombreArticulo,
                                                    MAX(CantidadCons) as CantidadCons
                                                    FROM Agrupamientos.xls (biff, embedded labels, table is [Hoja1$])
                                                    GROUP BY NombreArticulo;

                                                    INNER JOIN (TAB1)
                                                    LOAD MAX(CantidadCons) as CantidadCons,
                                                    CodComponente,
                                                    NombreArticulo
                                                    FROM Agrupamientos.xls (biff, embedded labels, table is [Hoja1$])
                                                    GROUP BY NombreArticulo, CodComponente;

                                                    TAB2:
                                                    LOAD NombreArticulo,
                                                    MAX(CantidadCons) as CantidadCons2,
                                                    LASTVALUE(CodComponente) as CodComponente2
                                                    RESIDENT TAB1
                                                    GROUP BY NombreArticulo;

                                                    DROP TABLE TAB1;

                                                    Primero hacemos en TAB1 el agrupamiento por Artículo consiguiendo su CantidadCons máximo, y luego en TAB2 agrupamos también por CodComponente. Después ya no necesitaríamos más TAB1 y lo descargamos de memoria.

                                                    Saludos