none
Unión RRS feed

  • Pregunta

  • Buen día, tengo 3 consultas con diferentes campos de fechas, necesito filtrar por estas. Como puedo hacer para meter las tres consultas en una sola y poder filtar? 

    SELECT T2.[SlpName] 'Sales Agent', T1.[CardName] 'Client', (T0.[CntctDate]), count(T0.[ClgCode]) 'activities created' FROM OCLG T0  INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode GROUP BY T2.[SlpName], T1.[CardName], month(T0.[CntctDate])

    SELECT T1.[SlpName] as 'Sales Agent', T2.[CardName] as 'Client',  (t0.[OpenDate]) as Month, count(T0.[OpprId]) as 'Opportunities' FROM OOPR T0  INNER JOIN OSLP T1 ON T0.SlpCode = T1.SlpCode INNER JOIN OCRD T2 ON T0.CardCode = T2.CardCode GROUP BY T1.[SlpName], T2.[CardName],  month(T0.[OpenDate])

    SELECT T2.[SlpName] 'SAles Agent', T3.[CardName] Client,(T1.[OpenDate]),  count(T1.[Step_Id]) as 'Stage 4' FROM OOPR T0  INNER JOIN OPR1 T1 ON T0.[OpprId] = T1.[OpprId] INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode INNER JOIN OCRD T3 ON T0.CardCode = T3.CardCode WHERE T1.[Step_Id] ='4' GROUP BY T2.[SlpName], T3.[CardName], month(T1.[OpenDate])




    • Editado Louisa_E miércoles, 18 de diciembre de 2019 17:18
    lunes, 2 de diciembre de 2019 15:56

Respuestas

  • Si claro. supongo que solicitas esto.

    SELECT T.[Sales Agent]				AS [Sales Agent]
         , T.Client						AS [Client]
         , T.Month						AS [Month]
         , SUM(T.[activities created])  AS [activities created]
         , SUM(T.[Opportunities])		AS [Opportunities]
         , SUM(T.[Stage 4])				AS [Stage 4]
    FROM
    (
        SELECT T2.[SlpName]			 AS [Sales Agent]
             , T1.[CardName]		 AS [Client]
             , MONTH(T0.[CntctDate]) AS [Month]
             , COUNT(T0.[ClgCode])	 AS [activities created]
             , 0					 AS [Opportunities]
             , 0					 AS [Stage 4]
        FROM OCLG T0
             INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode
             INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode
               GROUP BY T2.[SlpName]
                      , T1.[CardName]
                      , MONTH(T0.[CntctDate])
        UNION ALL
        SELECT T1.[SlpName]
             , T2.[CardName]
             , MONTH(T0.[OpenDate])
             , 0
             , COUNT(T0.[OpprId])
             , 0
        FROM OOPR T0
             INNER JOIN OSLP T1 ON T0.SlpCode = T1.SlpCode
             INNER JOIN OCRD T2 ON T0.CardCode = T2.CardCode
               GROUP BY T1.[SlpName]
                      , T2.[CardName]
                      , MONTH(T0.[OpenDate])
        UNION ALL
        SELECT T2.[SlpName]
             , T3.[CardName]
             , MONTH(T1.[OpenDate])
             , 0
             , 0
             , COUNT(T1.[Step_Id])
        FROM OOPR T0
             INNER JOIN OPR1 T1 ON T0.[OpprId] = T1.[OpprId]
             INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode
             INNER JOIN OCRD T3 ON T0.CardCode = T3.CardCode
               WHERE T1.[Step_Id] = '4'
               GROUP BY T2.[SlpName]
                      , T3.[CardName]
                      , MONTH(T1.[OpenDate])
    ) T
           GROUP BY T.[Sales Agent]
                  , T.Client
                  , T.[Month];

    Puedes en cada conjunto poner una columna con un valor que ni te va ni te viene. de manera que de la salida de los 3 conjuntos para cada columna solo escoges lo que te interesa. Como en este caso veo que estas usando la función de agregación count, pues utilizamos un 0. En la salida, sumamos, lo que no sea 0, que serán solo los valores del conjunto que queremos.

    Y agrupamos, para reducir las filas, que habíamos concatenado antes, para obtener por cada cliente y agente de ventas y mes, todos los datos en la misma fila.

    Group by

    https://javifer2.wordpress.com/2019/10/04/group-by-quizas-la-clausula-mas-conflictiva/

    • Marcado como respuesta Louisa_E jueves, 12 de diciembre de 2019 14:53
    miércoles, 11 de diciembre de 2019 23:13

Todas las respuestas

  • Si las tres consultas tienen los mismos campos, haz un UNION o UNION ALL de las tres y mételo en una CTE. Después aplicas el filtro sobre la CTE.

    WITH CTE AS
    (
         Select .... (aqui la consulta 1)
         UNION ALL
         Select .... (aqui la consulta 2)
         UNION ALL
         Select .... (aqui la consulta 3)
    )
    SELECT * FROM CTE WHERE (aqui tu filtro)
    

    lunes, 2 de diciembre de 2019 16:07
  • Hola una forma rápida

    SELECT T.*
    FROM
    (
    
    SELECT T2.[SlpName] 'Sales Agent', T1.[CardName] 'Client', month(T0.[CntctDate]) [Month], count(T0.[ClgCode]) 'activities created' 
    FROM OCLG T0  INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode 
    INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode GROUP BY T2.[SlpName], T1.[CardName], month(T0.[CntctDate])
    
    UNION ALL
    
    SELECT T1.[SlpName] as 'Sales Agent', T2.[CardName] as 'Client',  month(T0.[OpenDate]) as Month, count(T0.[OpprId]) as 'Opportunities' 
    FROM OOPR T0  INNER JOIN OSLP T1 ON T0.SlpCode = T1.SlpCode 
    INNER JOIN OCRD T2 ON T0.CardCode = T2.CardCode GROUP BY T1.[SlpName], T2.[CardName],  month(T0.[OpenDate])
    
    UNION ALL
    
    SELECT T2.[SlpName] 'SAles Agent', T3.[CardName] Client, month(T1.[OpenDate]) Month,  count(T1.[Step_Id]) as 'Stage 4' 
    FROM OOPR T0  INNER JOIN OPR1 T1 ON T0.[OpprId] = T1.[OpprId] 
    INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode 
    INNER JOIN OCRD T3 ON T0.CardCode = T3.CardCode WHERE T1.[Step_Id] ='4' GROUP BY T2.[SlpName], T3.[CardName], month(T1.[OpenDate])
    
    )T
    
    WHERE T.Month=6


    Votar y marcar respuestas es agradecer.
    Saludos.
    Lima-Perú

    • Propuesto como respuesta Diana AcuñaModerator lunes, 2 de diciembre de 2019 17:15
    • Marcado como respuesta Louisa_E martes, 3 de diciembre de 2019 20:22
    • Desmarcado como respuesta Louisa_E jueves, 12 de diciembre de 2019 14:53
    lunes, 2 de diciembre de 2019 16:08
  • Buen día, revisando de nuevo la consulta me doy cuenta que no sirve de mucho, ya que al hacer la unión solo me trae los datos de la primer tabla para crear una unión tiene que ser el mismo numero de campos en todos, cuanto los agrego no me funciona ya que en todos me salen los mismos valores, como filtro por fecha y por campo?

    SELECT T.*
    FROM
    (
    
    SELECT T2.[SlpName] 'Sales Agent', T1.[CardName] 'Client', month(T0.[CntctDate]) [Month], count(T0.[ClgCode]) 'activities created' 
    FROM OCLG T0  INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode 
    INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode GROUP BY T2.[SlpName], T1.[CardName], month(T0.[CntctDate])
    
    UNION ALL
    
    SELECT T1.[SlpName] as 'Sales Agent', T2.[CardName] as 'Client',  month(T0.[OpenDate]) as Month, count(T0.[OpprId]) as 'Opportunities' 
    FROM OOPR T0  INNER JOIN OSLP T1 ON T0.SlpCode = T1.SlpCode 
    INNER JOIN OCRD T2 ON T0.CardCode = T2.CardCode GROUP BY T1.[SlpName], T2.[CardName],  month(T0.[OpenDate])
    
    UNION ALL
    
    SELECT T2.[SlpName] 'SAles Agent', T3.[CardName] Client, month(T1.[OpenDate]) Month,  count(T1.[Step_Id]) as 'Stage 4' 
    FROM OOPR T0  INNER JOIN OPR1 T1 ON T0.[OpprId] = T1.[OpprId] 
    INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode 
    INNER JOIN OCRD T3 ON T0.CardCode = T3.CardCode WHERE T1.[Step_Id] ='4' GROUP BY T2.[SlpName], T3.[CardName], month(T1.[OpenDate])
    
    )T
    
    WHERE T.Month=6
    



    Nancy F

    miércoles, 11 de diciembre de 2019 17:45
  • Hola Nancy F:

    al hacer la unión solo me trae los datos de la primer tabla para crear una unión tiene que ser el mismo numero de campos en todos, cuanto los agrego no me funciona ya que en todos me salen los mismos valores

    Eso no es del todo correcto. Union all te devuelve todos los registros de cada conjunto por separado, pero con el mismo alias de columna.

    Por tanto si ejecutas

    SELECT T2.[SlpName] 'Sales Agent'
         , T1.[CardName] 'Client'
         , MONTH(T0.[CntctDate]) [Month]
         , COUNT(T0.[ClgCode]) 'activities created'
    FROM OCLG T0
         INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode
         INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode
           GROUP BY T2.[SlpName]
                  , T1.[CardName]
                  , MONTH(T0.[CntctDate]);

    Te devolverá x registros. Ahora si ejecutas

    SELECT T1.[SlpName] AS 'Sales Agent'
         , T2.[CardName] AS 'Client'
         , MONTH(T0.[OpenDate]) AS Month
         , COUNT(T0.[OpprId]) AS 'Opportunities'
    FROM OOPR T0
         INNER JOIN OSLP T1 ON T0.SlpCode = T1.SlpCode
         INNER JOIN OCRD T2 ON T0.CardCode = T2.CardCode
           GROUP BY T1.[SlpName]
                  , T2.[CardName]
                  , MONTH(T0.[OpenDate]);

    Te devolverá otros registros.

    Si ejecutas, el conjunto 1 y el conjunto 2, con union all te devolverá, los x del conjunto 1 más los y del conjunto 2, además los verás ordenados.

    Una opción simple, para saber lo que sucede, es poner una columna que identifique al conjunto.

    SELECT T.*
    FROM
    (
        SELECT 'first' as conjunto
    		 , T2.[SlpName] 'Sales Agent'
             , T1.[CardName] 'Client'
             , MONTH(T0.[CntctDate]) [Month]
             , COUNT(T0.[ClgCode]) 'activities created'
        FROM OCLG T0
             INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode
             INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode
               GROUP BY T2.[SlpName]
                      , T1.[CardName]
                      , MONTH(T0.[CntctDate])
        UNION ALL
        SELECT 'second' as conjunto
    		 , T1.[SlpName] AS 'Sales Agent'
             , T2.[CardName] AS 'Client'
             , MONTH(T0.[OpenDate]) AS Month
             , COUNT(T0.[OpprId]) AS 'Opportunities'
        FROM OOPR T0
             INNER JOIN OSLP T1 ON T0.SlpCode = T1.SlpCode
             INNER JOIN OCRD T2 ON T0.CardCode = T2.CardCode
               GROUP BY T1.[SlpName]
                      , T2.[CardName]
                      , MONTH(T0.[OpenDate])
        UNION ALL
        SELECT 'third' as conjunto
    		 , T2.[SlpName] 'SAles Agent'
             , T3.[CardName] Client
             , MONTH(T1.[OpenDate]) Month
             , COUNT(T1.[Step_Id]) AS 'Stage 4'
        FROM OOPR T0
             INNER JOIN OPR1 T1 ON T0.[OpprId] = T1.[OpprId]
             INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode
             INNER JOIN OCRD T3 ON T0.CardCode = T3.CardCode
               WHERE T1.[Step_Id] = '4'
               GROUP BY T2.[SlpName]
                      , T3.[CardName]
                      , MONTH(T1.[OpenDate])
    ) T
           WHERE T.Month = 6;

    Con ese identificador, sabrás de que conjunto te esta devolviendo los resultados.

    como filtro por fecha y por campo

    Qué utilices union all no significa, que no puedas aplicar filtros diferentes a los conjuntos interiores.

    Union /Union All sólo te obliga a devolver las mismas columnas, en el mismo orden y de tipos compatibles.

    Por tanto puedes hacer

    Select * from (select ....where .... union all select .... where otracosa..... union all.....where otra....) as t where otradiferente.

    miércoles, 11 de diciembre de 2019 21:10
  • Ya entendí, me salen los conjuntos hacia actividades, oportunidades pero hacia abajo habría una forma de que aparecieran las actividades justo a un lado de las oportunidades como una tabla?



    • Editado Louisa_E miércoles, 18 de diciembre de 2019 17:18
    miércoles, 11 de diciembre de 2019 22:36
  • Si claro. supongo que solicitas esto.

    SELECT T.[Sales Agent]				AS [Sales Agent]
         , T.Client						AS [Client]
         , T.Month						AS [Month]
         , SUM(T.[activities created])  AS [activities created]
         , SUM(T.[Opportunities])		AS [Opportunities]
         , SUM(T.[Stage 4])				AS [Stage 4]
    FROM
    (
        SELECT T2.[SlpName]			 AS [Sales Agent]
             , T1.[CardName]		 AS [Client]
             , MONTH(T0.[CntctDate]) AS [Month]
             , COUNT(T0.[ClgCode])	 AS [activities created]
             , 0					 AS [Opportunities]
             , 0					 AS [Stage 4]
        FROM OCLG T0
             INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode
             INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode
               GROUP BY T2.[SlpName]
                      , T1.[CardName]
                      , MONTH(T0.[CntctDate])
        UNION ALL
        SELECT T1.[SlpName]
             , T2.[CardName]
             , MONTH(T0.[OpenDate])
             , 0
             , COUNT(T0.[OpprId])
             , 0
        FROM OOPR T0
             INNER JOIN OSLP T1 ON T0.SlpCode = T1.SlpCode
             INNER JOIN OCRD T2 ON T0.CardCode = T2.CardCode
               GROUP BY T1.[SlpName]
                      , T2.[CardName]
                      , MONTH(T0.[OpenDate])
        UNION ALL
        SELECT T2.[SlpName]
             , T3.[CardName]
             , MONTH(T1.[OpenDate])
             , 0
             , 0
             , COUNT(T1.[Step_Id])
        FROM OOPR T0
             INNER JOIN OPR1 T1 ON T0.[OpprId] = T1.[OpprId]
             INNER JOIN OSLP T2 ON T0.SlpCode = T2.SlpCode
             INNER JOIN OCRD T3 ON T0.CardCode = T3.CardCode
               WHERE T1.[Step_Id] = '4'
               GROUP BY T2.[SlpName]
                      , T3.[CardName]
                      , MONTH(T1.[OpenDate])
    ) T
           GROUP BY T.[Sales Agent]
                  , T.Client
                  , T.[Month];

    Puedes en cada conjunto poner una columna con un valor que ni te va ni te viene. de manera que de la salida de los 3 conjuntos para cada columna solo escoges lo que te interesa. Como en este caso veo que estas usando la función de agregación count, pues utilizamos un 0. En la salida, sumamos, lo que no sea 0, que serán solo los valores del conjunto que queremos.

    Y agrupamos, para reducir las filas, que habíamos concatenado antes, para obtener por cada cliente y agente de ventas y mes, todos los datos en la misma fila.

    Group by

    https://javifer2.wordpress.com/2019/10/04/group-by-quizas-la-clausula-mas-conflictiva/

    • Marcado como respuesta Louisa_E jueves, 12 de diciembre de 2019 14:53
    miércoles, 11 de diciembre de 2019 23:13