none
consulta em mais de uma tabela SQL RRS feed

  • Pergunta

  • Boa Tarde pessoal,

    Tenho a seguinte seituação:
    Tabela Fornecedor
    codFornec
    Razão Social
    1 rterter
    2 dfgdfg
    3 cvbxcvb

    Tabela Atendimento
    codFornec numAT tempoAT
    1 25 2
    1 26 3,5
    2 27 4,5
    2 28 6
    3 29 1
    3 30 8

    Tabela Manutencao
    codFornec numManut tempoManut
    1 350 8
    1 356 7,5
    2 348 9,6
    2 369 4,9
    3 315 10,6
    3 325 17


    Desejo ter como resultado da minha pesquisa o seguinte:
    codFornec qtdServico tempoTotalServ qtdManutencao tempoTotalManutencao
    1 2 5,5 2 15,5
    2 2 10,5 2 14,5
    3 2 9 2 27,6


    Já tentei utilizar UNION e count(*), mas está me retornando os resultados em duas tuplas.

    (select f.codFornecedor, f.razao, count(*) as qtdMan
    from Fornecedor f, Manutencao m
    where f.codFornecedor = m.codFornecedor
    group by f.codFornecedor, f.razao
    order by f.codFornecedor)
    Union
    (select f.codFornecedor, f.razao, count(*) as qtdAT
    from Fornecedor f, Atendimentos a
    where f.codFornecedor = a.codFornecedor
    group by f.codFornecedor, f.razao
    order by f.codFornecedor)


    Desde já agradeço a atenção de todos


    quinta-feira, 15 de outubro de 2009 19:17

Respostas

  • USE TEMPDB
    GO
    
    DECLARE @Fornecedor TABLE
          (
                 CodFornec   TINYINT IDENTITY(1,1) PRIMARY KEY
                ,RazaoSocial VARCHAR(30)     
          );
    DECLARE  @Atendimento TABLE
          (
                 CodAtendimento TINYINT IDENTITY(1,1) PRIMARY KEY
                ,CodFornec      TINYINT 
                ,NumAt          SMALLINT
          );
    DECLARE @AtTempos TABLE
          (
                 NumAt   SMALLINT
                ,TempoAT NUMERIC(3,1)
          );
    DECLARE @Manutencao TABLE 
          (
                 CodManutencao TINYINT IDENTITY(1,1) PRIMARY KEY
                ,CodFornec     TINYINT 
                ,NumManut      SMALLINT
          );
    DECLARE @ManTempos TABLE
          (
                 NumManut    SMALLINT
                ,TempoMan    NUMERIC(3,1)
          );
    
    
    INSERT @Fornecedor(RazaoSocial) VALUES ('COCA-COLA')
    INSERT @Fornecedor(RazaoSocial) VALUES ('GUARAVITA')
    INSERT @Fornecedor(RazaoSocial) VALUES ('MATE-LEÃO')
    
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (1,25)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (1,26)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (2,27)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (2,28)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (3,29)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (3,30)
    
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (25,2)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (26,3.5)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (27,4.5)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (28,6)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (29,1)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (30,8)           
    
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (1,350)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (1,356)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (2,348)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (2,369)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (3,315)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (3,325)
    
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (350,8)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (356,7.5)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (348,9.6)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (369,4.9)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (315,10.6)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (325,17)
    
    
    SELECT 
        F.CodFornec      ,
        F.RazaoSocial    ,
        A.QtdServico     , 
        A.TempoTotalServ ,
        M.QtdManutencao  , 
        M.TempoTotalManutencao 
    FROM   
        @Fornecedor  AS F 
    INNER JOIN 
          (SELECT M1.CodFornec,
                  COUNT(M1.CodFornec) AS QtdManutencao, 
                  SUM(M2.TempoMan)    AS TempoTotalManutencao
           FROM       @Manutencao AS M1 
           INNER JOIN @ManTempos  AS M2 on M2.NumManut = M1.NumManut
           GROUP BY M1.CodFornec
          ) AS M ON F.CodFornec = M.CodFornec
    INNER JOIN 
          (SELECT A1.CodFornec,
                  COUNT(A1.CodFornec) AS QtdServico , 
                  SUM(A2.tempoAT)     AS TempoTotalServ 
           FROM       @Atendimento AS A1 
           INNER JOIN @AtTempos    AS A2 ON A1.NumAt = A2.NumAt
           GROUP BY A1.CodFornec
          )AS A ON M.CodFornec = A.CodFornec
    

    att. Leonardo Marcelino
    • Marcado como Resposta rs.franzoi sexta-feira, 16 de outubro de 2009 16:41
    sexta-feira, 16 de outubro de 2009 15:11

Todas as Respostas

  • Boa Noite

    veja se lhe atende

    SELECT 
        F.CodFornec      ,
        A.qtdServico     , 
        A.tempoTotalServ ,
        M.qtdManutencao  , 
        M.tempoTotalManutencao 
    FROM   
        Fornecedor  AS F 
    INNER JOIN 
          (SELECT CodFornec,
                  COUNT(CodFornec) AS qtdManutencao, 
                  SUM(tempoManut)  AS tempoTotalManutencao
           FROM Manutencao
           GROUP BY CodFornec
          ) AS M ON F.CodFornec = M.CodFornec
    INNER JOIN 
          (SELECT CodFornec,
                  COUNT(CodFornec) AS qtdServico , 
                  SUM(tempoAt)     AS tempoTotalServ 
           FROM Atendimento 
           GROUP BY CodFornec
          )AS A ON M.CodFornec = A.CodFornec




    se lhe for útil não esqueça de classificar


    att. Leonardo Marcelino
    • Sugerido como Resposta Leonardo Marcelino sexta-feira, 16 de outubro de 2009 03:02
    • Marcado como Resposta rs.franzoi sexta-feira, 16 de outubro de 2009 11:49
    • Não Marcado como Resposta rs.franzoi sexta-feira, 16 de outubro de 2009 17:08
    sexta-feira, 16 de outubro de 2009 03:00
  • Olá Rs Fransoi,

    Criei um exemplo do começo ao fim de acordo com a sua necessidade.

    --CRIANDO A ENTIDADE TEMPORÁRIA #TBFORNECEDOR

    CREATE TABLE #Fornecedor

          (

                 CodFornec TINYINT IDENTITY(1,1)

                      PRIMARY KEY

                ,RazaoSocial VARCHAR(30)    

          )

    GO

    --CRIANDO A ENTIDADE TEMPORÁRIA #TBATENDIMENTO

    CREATE TABLE #TbAtendimento

          (

                 CodAtendimento TINYINT IDENTITY(1,1)

                       PRIMARY KEY

                ,CodFornec TINYINT

                      FOREIGN KEY REFERENCES #Fornecedor(CodFornec)

                ,NumAt SMALLINT

                ,DaTempAt NUMERIC(3,1)

          )

    GO

    --CRIANDO A ENTIDADE TEMPORÁRIA #MANUTENÇÃO

    CREATE TABLE #TbManutencao

          (

                 CodManutencao TINYINT IDENTITY(1,1)

                       PRIMARY KEY

                ,CodFornec TINYINT

                      FOREIGN KEY REFERENCES #Fornecedor(CodFornec)

                ,NuManut SMALLINT

                ,DaTempManut NUMERIC(3,1)

          )

    GO

    --INSERINDO DADOS NA ENTIDADE #FORNECEDOR

    INSERT INTO #Fornecedor(RazaoSocial)

          VALUES('Bom SQL')

               ,('Bom T-SQL')

               ,('Bom Enginer')

    GO

    --INSERINDO DADOS NA ENTIDADE #TBATENDIMENTO

    INSERT INTO #TbAtendimento(CodFornec, NumAt, DaTempAt)

          VALUES(1,25,2)

               ,(1,26,3.5)

               ,(2,27,4.5)

               ,(2,28,6)

               ,(3,29,1)

               ,(3,30,8)

    GO

    --INSERINDO DADOS NA ENTIDADE #TBMANUTENÇÃO

    INSERT #TbManutencao(CodFornec, NuManut, DaTempManut)

          VALUES(1,350,8)

               ,(1,356,7.5)

               ,(2,348,9.6)

               ,(2,369,4.9)

               ,(3,315,10.6)

               ,(3,325,17)

    GO

    --CONSULTA

               SELECT F.CodFornec,

                      A.[Quantidade de Serviço],

                      M.[Quantidade de Manutenção],

                      A.[Tempo Total de Serviço],

                      M.[Tempo Total de Manutenção]

                 FROM #Fornecedor AS F

    INNER JOIN(

               SELECT CodFornec, COUNT(DaTempAt) AS [Quantidade de Serviço],

                                   SUM(DaTempAt) AS [Tempo Total de Serviço]

                 FROM #TbAtendimento

             GROUP BY CodFornec) AS A

                   ON F.CodFornec = A.CodFornec

    INNER JOIN(

               SELECT CodFornec, COUNT(CodFornec)   AS [Quantidade de Manutenção],

                                   SUM(DaTempManut) AS [Tempo Total de Manutenção]

                 FROM #TbManutencao

             GROUP BY CodFornec) AS M

                   ON F.CodFornec = M.CodFornec

    Resultado.

    CodFornec Quantidade de Serviço Quantidade de Manutenção Tempo Total de Serviço      Tempo Total de Manutenção

    --------- --------------------- ------------------------ --------------------------- ----------------------------

    1         2                     2                        5.5                         15.5

    2         2                     2                        10.5                        14.5

    3         2                     2                        9.0                         27.6

     

    (3 row(s) affected)



    Qualquer dúvida é só publicar, estarei sempre à disposição para melhor lhe atender.

    Caso tenha lhe ajudado não se esqueça de marca como útil, só assim ajudará a melhorar a qualidade do fórum.

    Heberton Melo
    MCP | MCTS em SQL Server 2008 | Projetista de Dados

    Blog: http://heberton-melo.spaces.live.com/

    • Marcado como Resposta rs.franzoi sexta-feira, 16 de outubro de 2009 11:48
    • Não Marcado como Resposta rs.franzoi sexta-feira, 16 de outubro de 2009 17:08
    • Sugerido como Resposta Heberton Melo sexta-feira, 16 de outubro de 2009 18:07
    sexta-feira, 16 de outubro de 2009 03:49
  • Heberton,

    Muito obrigado pela atenção, me ajudou muito a sua explicação.

    Simplifiquei a estrutura das minhas tabelas para tentar captar a informação passada no site e tentar manipulár na minha realidade,  não consegui adequar o Select que me enviaste perfeitamente a estrutura real que tenho na minha situação.

    Se não for abusar, gostaria que avaliasse a situação e me orientasse como posso alterar o comando que fizeste.

    Tabela Fornecedor
    -----------------------------------
    |codFornec  | Razão Social |
    |---------------|------------------|
    | 1                | Bom T-SQL    |
    | 2                | Bom T-SQL    |
    | 3                | Bom Enginer  |
    -------------------------------------
    Tabela Atendimento 
    ----------------------------
    | codFornec   | numAT  | 
    |  1                 |  25        |
    |  1                 |  26        |
    |  2                 |  27        |
    |  2                 |  28        |
    |  3                 |  29        |
    |  3                 |  30        |
    ----------------------------
    Tabela AtTempos
    --------------------------
    | numAT | tempoAT |
    | 25           | 2           |
    | 26           | 3,5        |
    | 27           | 4,5        |
    | 28           | 6           |
    | 29           | 1           |
    | 30           | 8           |
    --------------------------
    Tabela Manutencao
    ----------------------------
    | codFornec | numMan| 
    |  1               |  350      |
    |  1               |  356      |
    |  2               |  348      |
    |  2               |  369      |
    |  3               |  315      |
    |  3               |  325      |
    ----------------------------
    Tabela ManTempos
    --------------------------
    | numMan | tempoMan|
    | 350         | 8               |
    | 356         | 7,5            |
    | 348         | 9,6            |
    | 369         | 4,9            |
    | 315         | 10,6          |
    | 325         | 17             |
    ---------------------------

    A estrutura é basicamente essa, tentei alterar o SQL que enviaste para adaptar mas não obtive sucesso. Segue abaixo a alteração que fiz:


    SELECT F.CodFornec,
              A.[Quantidade de Serviço],
              M.[Quantidade de Manutenção],
              ASer.[Tempo Total de Serviço],
              MSer.[Tempo Total de Manutenção]
      FROM #Fornecedor AS F
    INNER JOIN(
          SELECT CodFornec, COUNT(DaTempAt) AS [Quantidade de Serviço]
            FROM #TbAtendimento
            INNER JOIN 
                 (SELECT numAT, 
                         SUM(tempoAT)  AS [Tempo Total de Serviço]
                    FROM AtTempos
                  GROUP BY os
                  ) AS ASer
             ON A.numAT = Aser.numAT
             GROUP BY CodFornec) AS A 
             ON F.CodFornec = A.CodFornec
    INNER JOIN(
               SELECT CodFornec, COUNT(CodFornec)   AS [Quantidade de Manutenção]
                 FROM #TbManutencao 
                 INNER JOIN 
                       (SELECT numMan, 
                               SUM(tempoMan)  AS [Tempo Total de Manutenção]
                          FROM ManTempos
                       GROUP BY os
                       ) AS MSer
                ON M.numMan = Mser.numMan
                GROUP BY CodFornec) AS M 
                ON F.CodFornec = M.CodFornec


     

    sexta-feira, 16 de outubro de 2009 13:04
  • USE TEMPDB
    GO
    
    DECLARE @Fornecedor TABLE
          (
                 CodFornec   TINYINT IDENTITY(1,1) PRIMARY KEY
                ,RazaoSocial VARCHAR(30)     
          );
    DECLARE  @Atendimento TABLE
          (
                 CodAtendimento TINYINT IDENTITY(1,1) PRIMARY KEY
                ,CodFornec      TINYINT 
                ,NumAt          SMALLINT
          );
    DECLARE @AtTempos TABLE
          (
                 NumAt   SMALLINT
                ,TempoAT NUMERIC(3,1)
          );
    DECLARE @Manutencao TABLE 
          (
                 CodManutencao TINYINT IDENTITY(1,1) PRIMARY KEY
                ,CodFornec     TINYINT 
                ,NumManut      SMALLINT
          );
    DECLARE @ManTempos TABLE
          (
                 NumManut    SMALLINT
                ,TempoMan    NUMERIC(3,1)
          );
    
    
    INSERT @Fornecedor(RazaoSocial) VALUES ('COCA-COLA')
    INSERT @Fornecedor(RazaoSocial) VALUES ('GUARAVITA')
    INSERT @Fornecedor(RazaoSocial) VALUES ('MATE-LEÃO')
    
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (1,25)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (1,26)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (2,27)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (2,28)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (3,29)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (3,30)
    
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (25,2)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (26,3.5)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (27,4.5)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (28,6)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (29,1)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (30,8)           
    
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (1,350)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (1,356)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (2,348)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (2,369)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (3,315)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (3,325)
    
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (350,8)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (356,7.5)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (348,9.6)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (369,4.9)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (315,10.6)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (325,17)
    
    
    SELECT 
        F.CodFornec      ,
        F.RazaoSocial    ,
        A.QtdServico     , 
        A.TempoTotalServ ,
        M.QtdManutencao  , 
        M.TempoTotalManutencao 
    FROM   
        @Fornecedor  AS F 
    INNER JOIN 
          (SELECT M1.CodFornec,
                  COUNT(M1.CodFornec) AS QtdManutencao, 
                  SUM(M2.TempoMan)    AS TempoTotalManutencao
           FROM       @Manutencao AS M1 
           INNER JOIN @ManTempos  AS M2 on M2.NumManut = M1.NumManut
           GROUP BY M1.CodFornec
          ) AS M ON F.CodFornec = M.CodFornec
    INNER JOIN 
          (SELECT A1.CodFornec,
                  COUNT(A1.CodFornec) AS QtdServico , 
                  SUM(A2.tempoAT)     AS TempoTotalServ 
           FROM       @Atendimento AS A1 
           INNER JOIN @AtTempos    AS A2 ON A1.NumAt = A2.NumAt
           GROUP BY A1.CodFornec
          )AS A ON M.CodFornec = A.CodFornec
    

    att. Leonardo Marcelino
    • Marcado como Resposta rs.franzoi sexta-feira, 16 de outubro de 2009 16:41
    sexta-feira, 16 de outubro de 2009 15:11
  • Leonardo,
    Excelente!!!!
    Ficou muito boa sua explanação....

    Tenho uma ressalva, quando executo os blocos de SELECT Separadamente eles retornam 35 tuplas no Select de Manutenção e 10 tuplas no Select de Atendimentos. Executando todo o comando está retornando apenas os que apenas as 5 tuplas que estão presentes nos dois blocos de comando.
    Tentei alterar o INNER para LEFT nas duas junções principais, porém ele me retorna todos os fornecedores independente de ter ou não registro nas demais tabelas.

    Teria alguma sugestão?
    sexta-feira, 16 de outubro de 2009 16:55
  • não entendi, executei aqui e esta retornando (de acordo comos dados passados) os valores corretos.

    se puder explicar melhor...


    att. Leonardo Marcelino
    sexta-feira, 16 de outubro de 2009 17:20
  • Leonardo,
    Um determinado fornecedor não tem necessáriamente atendimento e manutenção, podem ocorrer casos em que vão existir registros em apenas uma das tabelas ou em vezes em nenhuma delas.

    Tinha colocado umas tabelas para exemplificar, mas está dando conflito...

    Bloco do SELECT ref. a Atendimento             Bloco do SELECT ref. a MAnutenção
       +------------------------------+                     +-------------------------------------+
       Fornec  |  qtdAT   | tempoAT                       Fornec   |   qtdMan   | tempo Man
           1           70           30                                3                 45            90
           3           15           10                                5                 25            50
           8           20           80                                9                 30            70
           9           10           50

    Resultado do comando inteiro
       +-------------------------------------------------------------------+
       Fornec  |  qtdAT   | tempoAT   |  qtdMan   | tempo Man
           3           15           10                45            90
           9           10           50                30            70

    Eugostaria que aparecesse todos os fornecedores que tiveram Atendimento ou manutenção com os registros zerados ou vazios quando não tivessem valor, veja abaixo:
       +-------------------------------------------------------------------+
       Fornec  |  qtdAT   | tempoAT   |  qtdMan   | tempo Man
           1           70           30                  0             0
           3           15           10                45            90
           5             0             0                25            50
           8           20           80                  0             0
           9           10           50                30            70


    Não sei se consegui me expressar melhor agora?

    Obrigado pela atenção!!!
    sexta-feira, 16 de outubro de 2009 18:10
  • Segue uma nova query com as devidas atualizações e novos registros para comparações.

    USE TEMPDB
    GO
    
    DECLARE @Fornecedor TABLE
          (
                 CodFornec   TINYINT IDENTITY(1,1) PRIMARY KEY
                ,RazaoSocial VARCHAR(30)     
          );
    DECLARE  @Atendimento TABLE
          (
                 CodAtendimento TINYINT IDENTITY(1,1) PRIMARY KEY
                ,CodFornec      TINYINT 
                ,NumAt          SMALLINT
          );
    DECLARE @AtTempos TABLE
          (
                 NumAt   SMALLINT
                ,TempoAT NUMERIC(3,1)
          );
    DECLARE @Manutencao TABLE 
          (
                 CodManutencao TINYINT IDENTITY(1,1) PRIMARY KEY
                ,CodFornec     TINYINT 
                ,NumManut      SMALLINT
          );
    DECLARE @ManTempos TABLE
          (
                 NumManut    SMALLINT
                ,TempoMan    NUMERIC(3,1)
          );
    
    
    INSERT @Fornecedor(RazaoSocial) VALUES ('COCA-COLA')
    INSERT @Fornecedor(RazaoSocial) VALUES ('GUARAVITA')
    INSERT @Fornecedor(RazaoSocial) VALUES ('MATE-LEÃO')
    INSERT @Fornecedor(RazaoSocial) VALUES ('CHOPP')
    INSERT @Fornecedor(RazaoSocial) VALUES ('ÁGUA MINERAL')
    
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (1,25)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (1,26)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (2,27)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (2,28)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (3,29)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (3,30)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (5,31)
    INSERT INTO @Atendimento(CodFornec, NumAt) VALUES (5,32)
    
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (25,2)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (26,3.5)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (27,4.5)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (28,6)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (29,1)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (30,8)           
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (31,6)
    INSERT INTO @AtTempos(NumAt,TempoAT) VALUES (32,5)
    
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (1,350)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (1,356)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (2,348)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (2,369)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (3,315)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (3,325)
    INSERT INTO @Manutencao(CodFornec, NumManut) VALUES (4,300)
    
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (350,8)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (356,7.5)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (348,9.6)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (369,4.9)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (315,10.6)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (325,17)
    INSERT INTO @ManTempos(NumManut, TempoMan) VALUES (300,3)
    
    
    -- ATENDIMENTOS 
    SELECT A1.CodFornec,
          COUNT(A1.CodFornec) AS QtdServico , 
          SUM(A2.tempoAT)     AS TempoTotalServ 
    FROM       @Atendimento AS A1 
    INNER JOIN @AtTempos    AS A2 ON A1.NumAt = A2.NumAt
    GROUP BY A1.CodFornec
    
    -- MANUTENÇÃO
    SELECT M1.CodFornec,
          COUNT(M1.CodFornec) AS QtdManutencao, 
          SUM(M2.TempoMan)    AS TempoTotalManutencao
    FROM       @Manutencao AS M1 
    INNER JOIN @ManTempos  AS M2 on M2.NumManut = M1.NumManut
    GROUP BY M1.CodFornec
    
    -- TUDO
    SELECT 
        F.CodFornec                                              ,
        F.RazaoSocial                                            ,
        ISNULL(A.QtdServico,0)           AS QtdServico           , 
        ISNULL(A.TempoTotalServ,0)       AS TempoTotalServ       ,
        ISNULL(M.QtdManutencao,0)        AS QtdManutencao        , 
        ISNULL(M.TempoTotalManutencao,0) AS TempoTotalManutencao
    FROM   
        @Fornecedor  AS F 
    
    LEFT JOIN --> Manutenção 
    
          (SELECT M1.CodFornec,
                  COUNT(M1.CodFornec) AS QtdManutencao, 
                  SUM(M2.TempoMan)    AS TempoTotalManutencao
           FROM       @Manutencao AS M1 
           INNER JOIN @ManTempos  AS M2 on M2.NumManut = M1.NumManut
           GROUP BY M1.CodFornec
          ) AS M ON F.CodFornec = M.CodFornec
    
    LEFT JOIN  --> Atendimentos
    
          (SELECT A1.CodFornec,
                  COUNT(A1.CodFornec) AS QtdServico , 
                  SUM(A2.tempoAT)     AS TempoTotalServ 
           FROM       @Atendimento AS A1 
           INNER JOIN @AtTempos    AS A2 ON A1.NumAt = A2.NumAt
           GROUP BY A1.CodFornec
          )AS A ON F.CodFornec = A.CodFornec  

    att. Leonardo Marcelino
    sexta-feira, 16 de outubro de 2009 18:18
  • Leonardo,
    Acho que não consegui me expressar corretamente, isso que tu enviaste eu já havia conseguindo fazer e continua apresentando o seguinte problema:
    Acrescenta masi dois fornecedores na sua tabela, e não acrescenta nenhum atendimento nem manutenção. Perceba que eles aparecerão no resultado da busca  (essa última enviada com LEFT JOIN).
    Veja no último post que enviei que não aparecem os fornecedores de codigo (2, 4, 6 e 7), pois os mesmos não tem nenhuma registro nessas tabelas.

    Valeu pelas dicas, se puder matar essa última fechamos o assunto.

    Um abraço!
    sexta-feira, 16 de outubro de 2009 18:49
  • Acrescente esse trecho na query

    WHERE 
        (A.QtdServico IS NOT NULL OR M.QtdManutencao IS NOT NULL)  
    

     

    assim eu acho q conclui.



    obs.: na última q eu postei
    att. Leonardo Marcelino
    sexta-feira, 16 de outubro de 2009 20:40