none
Erro: All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists. RRS feed

  • Pergunta

  • Caros, boa noite

    Ao executar a query abaixo apresenta o seguinte erro: "All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.", não consegui identificar a solução e por isso gostaria de uma ajuda quanto ao que posso ter feito de errado

    SELECT

    A.LOGIN
    , FORMAT(A.DATA,'dd/MM/yyyy') AS DATA      
    , SUM(CASE WHEN A.DESCRIPTION = 'BANHEIRO' THEN 1 ELSE 0 END) AS QTD_BANHEIRO      
    , SUM(CASE WHEN A.DESCRIPTION = 'BANHEIRO' THEN A.TEMPO_STOP ELSE 0 END) AS TEMPO_BANHEIRO      
    , SUM(CASE WHEN A.DESCRIPTION = 'PAUSA - 20' THEN 1 ELSE 0 END) AS QTD_LANCHE      
    , SUM(CASE WHEN A.DESCRIPTION = 'PAUSA - 20' THEN A.TEMPO_STOP ELSE 0 END) AS TEMPO_LANCHE      
    , SUM(CASE WHEN A.DESCRIPTION = 'PAUSA - 10' THEN 1 ELSE 0 END) AS QTD_DESCANSO      
    , SUM(CASE WHEN A.DESCRIPTION = 'PAUSA - 10' THEN A.TEMPO_STOP ELSE 0 END) AS TEMPO_DESCANSO      
    , SUM(CASE WHEN A.DESCRIPTION = 'TREINAMENTO' THEN 1 ELSE 0 END) AS QTD_TREINAMENTO      
    , SUM(CASE WHEN A.DESCRIPTION = 'TREINAMENTO' THEN A.TEMPO_STOP ELSE 0 END) AS TEMPO_TREINAMENTO      
    , SUM(CASE WHEN A.DESCRIPTION = 'FEEDBACK' THEN 1 ELSE 0 END) AS QTD_FEEDBACK          
    , SUM(CASE WHEN A.DESCRIPTION = 'FEEDBACK' THEN A.TEMPO_STOP ELSE 0 END) AS TEMPO_FEEDBACK      
    FROM  (  SELECT      AA.LOGIN      
    , CONVERT(DATE,AA.STARTDATE) AS DATA      
    , AA.DESCRIPTION      
    , AA.STARTDATE AS LOGIN_TIME      
    , AA.STOPDATE AS LOGOUT_TIME      
    , CASE WHEN AA.LOGIN = BB.LOGIN AND CONVERT(DATE,AA.STOPDATE) = CONVERT(DATE, BB.STARTDATE)
    THEN CONVERT(float, BB.STARTDATE) - CONVERT(float, AA.STOPDATE)
    ELSE NULL END AS TEMPO_STOP   FROM  (  SELECT ROW_NUMBER() OVER (ORDER BY A.LOGIN, A.STARTDATE) AS ID1      
    , A.*  FROM  (  SELECT ROW_NUMBER() OVER (ORDER BY A.LOGIN, A.STARTDATE) AS ID1      
    ,A.LOGIN      
    , FORMAT(CONVERT(DATE,A.STARTDATE),'dd/MM/yyyy') AS DATA      
    , B.DESCRIPTION      , A.STARTDATE      
    , A.STOPDATE  FROM      (PREP.PCO_WORKLOG AS A (NOLOCK) LEFT JOIN PREP.PCO_STOPREASON  AS B (NOLOCK) ON A.REASONCODE = B.STOPCODE)  
    WHERE      CONVERT(date,A.STARTDATE) >= DATEADD("M",-3,GETDATE())      AND A.LOGIN = 4150  UNION ALL  SELECT B.LOGIN      
    , FORMAT(CONVERT(DATE,B.CONNECTDATE),'dd/MM/yyyy') AS DATA      
    , C.DESCRIPTION      , B.CONNECTDATE      
    , NULL  FROM PREP.PCO_CONNECTIONLOG AS B LEFT JOIN PREP.PCO_LOGOUTREASON  AS C (NOLOCK) ON B.REASONCODE = C.LOGOUTCODE  WHERE CONVERT(date,B.CONNECTDATE) >= DATEADD("M",-3,GETDATE())      
    AND B.LOGIN = 4150  UNION ALL  SELECT B.LOGIN      
    , FORMAT(CONVERT(DATE,B.CONNECTDATE),'dd/MM/yyyy') AS DATA      
    , C.DESCRIPTION      
    , B.DISCONNECTDATE      
    , NULL  FROM PREP.PCO_CONNECTIONLOG AS B LEFT JOIN PREP.PCO_LOGOUTREASON  AS C (NOLOCK) ON B.REASONCODE = C.LOGOUTCODE  WHERE CONVERT(date,B.CONNECTDATE) >= DATEADD("M",-3,GETDATE())      
    AND B.LOGIN = 4150  ) AS A  ) AS AA LEFT JOIN   (  SELECT ROW_NUMBER() OVER (ORDER BY A.LOGIN, A.STARTDATE) AS ID2      
    , A.*  FROM  (  SELECT        
    ROW_NUMBER() OVER (ORDER BY A.LOGIN, A.STARTDATE) AS ID1      
    ,A.LOGIN      
    , FORMAT(CONVERT(DATE,A.STARTDATE),'dd/MM/yyyy') AS DATA      
    , B.DESCRIPTION      
    , A.STARTDATE      
    , A.STOPDATE  
    FROM      (PREP.PCO_WORKLOG AS A (NOLOCK) LEFT JOIN PREP.PCO_STOPREASON  AS B (NOLOCK) ON A.REASONCODE = B.STOPCODE)  
    WHERE      CONVERT(date,A.STARTDATE) >= DATEADD("M",-3,GETDATE())      
    AND A.LOGIN = 4150  UNION ALL  SELECT B.LOGIN      
    , FORMAT(CONVERT(DATE,B.CONNECTDATE),'dd/MM/yyyy') AS DATA      , C.DESCRIPTION      
    , B.CONNECTDATE      
    , NULL  FROM PREP.PCO_CONNECTIONLOG AS B LEFT JOIN PREP.PCO_LOGOUTREASON  AS C (NOLOCK) ON B.REASONCODE = C.LOGOUTCODE  
    WHERE CONVERT(date,B.CONNECTDATE) >= DATEADD("M",-3,GETDATE())      
    AND B.LOGIN = 4150  UNION ALL  SELECT B.LOGIN      
    , FORMAT(CONVERT(DATE,B.CONNECTDATE),'dd/MM/yyyy') AS DATA      , C.DESCRIPTION      , B.DISCONNECTDATE      
    , NULL  FROM PREP.PCO_CONNECTIONLOG AS B LEFT JOIN PREP.PCO_LOGOUTREASON  AS C (NOLOCK) ON B.REASONCODE = C.LOGOUTCODE  
    WHERE CONVERT(date,B.CONNECTDATE) >= DATEADD("M",-3,GETDATE())      
    AND B.LOGIN = 4150  ) AS A  ) AS BB ON AA.ID1 = BB.ID2-1  
    WHERE AA.REASONCODE NOT IN (11,14)  ) AS A   
    GROUP BY      A.LOGIN      , A.DATA

    Obrigado.

    terça-feira, 21 de abril de 2020 00:40

Todas as Respostas

  • Raul,

    A mensagem de erro informa que você deve declarar ou utilizar a mesma quantidade de colunas e seus tipos de dados devem ser compatíveis, quando se utiliza os comando Union, Except ou Intersect.

    Verifique os blocos de código Select que você esta declarando, bem como, a quantidade e ordem de apresentação e declaração das colunas.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 21 de abril de 2020 21:21
    Moderador
  • Raul, complementando a resposta do Junior, seu problema está nessa parte do código:

      (SELECT ROW_NUMBER() OVER (ORDER BY A.LOGIN,A.STARTDATE) AS ID1 ,
                                      A.LOGIN ,
                                      FORMAT(CONVERT(DATE,A.STARTDATE), 'dd/MM/yyyy') AS DATA ,
                                      B.DESCRIPTION ,
                                      A.STARTDATE ,
                                      A.STOPDATE
             FROM (PREP.PCO_WORKLOG AS A (NOLOCK)
                   LEFT JOIN PREP.PCO_STOPREASON AS B (NOLOCK) ON A.REASONCODE = B.STOPCODE)
             WHERE CONVERT(date,A.STARTDATE) >= DATEADD("M", -3, GETDATE())
               AND A.LOGIN = 4150

    A coluna ID1 existe apenas nessa primeira query e não nas duas seguintes que estão no UNION.
    Então ou você retira essa coluna ou coloca um valor "fake" nas duas queries embaixo para que o número de colunas seja igual, como o Junior falou.



    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    quarta-feira, 29 de abril de 2020 17:24
  • Raul, complementando a resposta do Junior, seu problema está nessa parte do código:

      (SELECT ROW_NUMBER() OVER (ORDER BY A.LOGIN,A.STARTDATE) AS ID1 ,
                                      A.LOGIN ,
                                      FORMAT(CONVERT(DATE,A.STARTDATE), 'dd/MM/yyyy') AS DATA ,
                                      B.DESCRIPTION ,
                                      A.STARTDATE ,
                                      A.STOPDATE
             FROM (PREP.PCO_WORKLOG AS A (NOLOCK)
                   LEFT JOIN PREP.PCO_STOPREASON AS B (NOLOCK) ON A.REASONCODE = B.STOPCODE)
             WHERE CONVERT(date,A.STARTDATE) >= DATEADD("M", -3, GETDATE())
               AND A.LOGIN = 4150

    A coluna ID1 existe apenas nessa primeira query e não nas duas seguintes que estão no UNION.
    Então ou você retira essa coluna ou coloca um valor "fake" nas duas queries embaixo para que o número de colunas seja igual, como o Junior falou.



    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    Mari,

    Isso mesmo.... Importante também construções as condições e passando de parâmetros de uma forma que o SQL Server possa entender os valores que estão sendo passados para facilitar a busca e retorno dos valores.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 29 de abril de 2020 21:35
    Moderador