none
Agrupar Resultados Query RRS feed

  • Pergunta

  • Bom dia colegas,

    Hoje preciso de uma ajuda vossa

    Tenho a seguinte query que me faz a leitura de dados a tabela Vendor e da tabela Change Log Entry (Objectivo é saber em que data foi criado determinado vendedor)

    SELECT top 10 (No_ )AS [Nº Fornecedor], Name AS [Nome  Fornecedor], [Last Date Modified] AS [Ultima Modificação],

                              (SELECT     CASE [Qualified] WHEN '01' THEN 'Sim' ELSE 'Não' END AS exp2) AS Qualificado,

                              (SELECT     CASE [Subject to Evaluation] WHEN '01' THEN 'Sim' ELSE 'Não' END AS exp3) AS [Sujeito Avaliação], [Vendor Class Code] AS [Cod. Class Fornecedor],

                              (SELECT     CASE [Vendor Class Code] WHEN '01' THEN 'Fornecedores Serviços' WHEN '02' THEN 'Fornecedores Materiais'  ELSE 'Não Classificado' END AS exp1) AS [Desc. Class Fornecedor],

    B.[Date and Time] AS [Data Registo], B.[User ID] AS [User], B.[Entry No_]

    FROM         dbo.Minha_BD$Vendor

     LEFT OUTER JOIN

                          dbo.[Minha_BD$Change Log Entry] AS B ON dbo.Minha_BD$Vendor.No_ = B.[Primary Key Field 1 Value]

    WHERE  (dbo.[Minha_BD$Vendor].[No_] = B.[Primary Key Field 1 Value])

    ORDER BY B.[Entry No_]

    O problema é que não estou a conseguir filtrar, ou seja, para cada nº fornecedor, deveria apenas surgir o primeiro registo (Entry No_)

    NOTA: o top 10 é apenas limitar a quantidade de linhas

    Uma ajudinha era muito bem vinda.

    Desde já muito obrigado.

    Nº Fornecedor

    Nome  Fornecedor

    Ultima Modificação

    Qualificado

    Sujeito Avaliação

    Cod. Class Fornecedor

    Desc. Class Fornecedor

    Data Registo

    User

    Entry No_

    111000

    Fornecedor 1

    2014-08-19 00:00:00.000

    Não

    Não

    14

    Serviços – Colaboradores

    2012-04-11 15:18:00.690

    User 1

    993

    111000

    Fornecedor 1

    2014-08-19 00:00:00.000

    Não

    Não

    14

    Serviços – Colaboradores

    2012-04-11 15:18:00.690

    User 1

    994

    111000

    Fornecedor 3

    2014-08-19 00:00:00.000

    Não

    Não

    14

    Serviços – Colaboradores

    2012-04-13 11:01:04.517

    User 1

    1263

    2200992

    Fornecedor 3

    2014-10-17 00:00:00.000

    Sim

    Não

    19

    Serviços – INATIVOS

    2012-04-17 20:09:10.837

    User 2

    3434

    2200992

    Fornecedor 3

    2014-10-17 00:00:00.000

    Sim

    Não

    19

    Serviços – INATIVOS

    2012-04-17 20:09:10.837

    User 2

    3435

    2200992

    Fornecedor 3

    2014-10-17 00:00:00.000

    Sim

    Não

    19

    Serviços – INATIVOS

    2012-04-17 20:09:10.837

    User 2

    3436



    Nuno Silva

    terça-feira, 19 de maio de 2015 13:59

Respostas

  • Bom dia,

    Experimente fazer um teste substituindo o trecho abaixo

    LEFT OUTER JOIN
    
                          dbo.[Minha_BD$Change Log Entry] AS B ON dbo.Minha_BD$Vendor.No_ = B.[Primary Key Field 1 Value]
    
    WHERE  (dbo.[Minha_BD$Vendor].[No_] = B.[Primary Key Field 1 Value])
    
    ORDER BY B.[Entry No_]

    por

    cross apply
    (
        select top(1) * 
        from dbo.[Minha_BD$Change Log Entry] AS B
        where B.[Primary Key Field 1 Value] = dbo.Minha_BD$Vendor.No_
        ORDER BY B.[Entry No_]
    ) as ca
    

    Se funcionar seria melhor você posteriormente substituir o * pelas colunas da tabela de log que são utilizadas na query.

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 20 de maio de 2015 14:45
  • Resolvido. Muito Obrigado

    SELECT TOP 2 No_ AS [Nº Fornecedor], Name AS [Nome  Fornecedor], [Last Date Modified] AS [Ultima Modificação],
                              (SELECT     CASE [Qualified] WHEN '01' THEN 'Sim' ELSE 'Não' END AS exp2) AS Qualificado,
                              (SELECT     CASE [Subject to Evaluation] WHEN '01' THEN 'Sim' ELSE 'Não' END AS exp3) AS [Sujeito Avaliação], [Vendor Class Code] AS [Cod. Class Fornecedor],
                              (SELECT     CASE [Vendor Class Code] WHEN '01' THEN 'Fornecedores Serviços' WHEN '02' THEN 'Fornecedores Materiais' ELSE 'Não Classificado' END AS exp1) AS [Desc. Class Fornecedor],
      ca.[Date and Time] AS [Data Registo], ca.[User ID] AS [User] 
                                                                                                                                         
    FROM         dbo.[Minha_BD$Vendor]
    cross apply
    (
        select top(1) [User ID], [Entry No_], [Date and Time]
        from dbo.[Minha_BD$Change Log Entry] AS B
        where B.[Primary Key Field 1 Value] = dbo.[Minha_BD$Vendor].[No_]
        ORDER BY B.[Entry No_]
    ) as ca



    Nuno Silva

    quarta-feira, 20 de maio de 2015 15:53

Todas as Respostas

  • JavaLL,

    Você poderia postar a estrutura e alguns dados destas tabelas?

    Acredito que não seja necessário fazer uso de Subquery no seu código, dependendo do relacionamento e modelagem podemos fazer uso de Joins.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 19 de maio de 2015 14:19
  • Galvão

    Antes de mais obrigado.

    O único relacionamento que tenho entre as duas tabelas é o numero de fornecedor.

    dbo.[Minha_BD$Vendor].[No_] =  dbo.[Minha_BD$Change Log Entry].[Primary Key Field 1 Value]


    Nuno Silva

    quarta-feira, 20 de maio de 2015 14:32
  • Bom dia,

    Experimente fazer um teste substituindo o trecho abaixo

    LEFT OUTER JOIN
    
                          dbo.[Minha_BD$Change Log Entry] AS B ON dbo.Minha_BD$Vendor.No_ = B.[Primary Key Field 1 Value]
    
    WHERE  (dbo.[Minha_BD$Vendor].[No_] = B.[Primary Key Field 1 Value])
    
    ORDER BY B.[Entry No_]

    por

    cross apply
    (
        select top(1) * 
        from dbo.[Minha_BD$Change Log Entry] AS B
        where B.[Primary Key Field 1 Value] = dbo.Minha_BD$Vendor.No_
        ORDER BY B.[Entry No_]
    ) as ca
    

    Se funcionar seria melhor você posteriormente substituir o * pelas colunas da tabela de log que são utilizadas na query.

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 20 de maio de 2015 14:45
  • Muito Obrigada, funciona. Nunca usei a função cross apply.

    SELECT TOP 2 No_ AS [Nº Fornecedor], Name AS [Nome  Fornecedor], [Last Date Modified] AS [Ultima Modificação],
                              (SELECT     CASE [Qualified] WHEN '01' THEN 'Sim' ELSE 'Não' END AS exp2) AS Qualificado,
                              (SELECT     CASE [Subject to Evaluation] WHEN '01' THEN 'Sim' ELSE 'Não' END AS exp3) AS [Sujeito Avaliação], [Vendor Class Code] AS [Cod. Class Fornecedor],
                              (SELECT     CASE [Vendor Class Code] WHEN '01' THEN 'Fornecedores Serviços' WHEN '02' THEN 'Fornecedores Materiais' ELSE 'Não Classificado' END AS exp1) AS [Desc. Class Fornecedor]
                                                                                                                                         
    FROM         dbo.[Minha_BD$Vendor]
    cross apply
    (
        select top(1) [User ID], [Entry No_], [Date and Time]
        from dbo.[Minha_BD$Change Log Entry] AS B
        where B.[Primary Key Field 1 Value] = dbo.[Minha_BD$Vendor].[No_]
        ORDER BY B.[Entry No_]
    ) as ca
    Só estou com problema é ao mostrar as colunas, que estou a chamar no cross apply
    [User ID], [Entry No_], [Date and Time]

    Actualmente tenho os seguintes resultados:

    Nº Fornecedor	Nome  Fornecedor	Ultima Modificação	Qualificado	Sujeito Avaliação	Cod. Class Fornecedor	Desc. Class Fornecedor
    Fornecedor1	Nome1	2015-05-13 00:00:00.000	Não	Não	14	Serviços – Colaboradores
    Fornecedor2	Nome2	2015-05-13 00:00:00.000	Não	Não	14	Serviços – Colaboradores
    



    Nuno Silva


    • Editado NunoM Silva quarta-feira, 20 de maio de 2015 15:22 Correcao apresentação
    quarta-feira, 20 de maio de 2015 15:16
  • Resolvido. Muito Obrigado

    SELECT TOP 2 No_ AS [Nº Fornecedor], Name AS [Nome  Fornecedor], [Last Date Modified] AS [Ultima Modificação],
                              (SELECT     CASE [Qualified] WHEN '01' THEN 'Sim' ELSE 'Não' END AS exp2) AS Qualificado,
                              (SELECT     CASE [Subject to Evaluation] WHEN '01' THEN 'Sim' ELSE 'Não' END AS exp3) AS [Sujeito Avaliação], [Vendor Class Code] AS [Cod. Class Fornecedor],
                              (SELECT     CASE [Vendor Class Code] WHEN '01' THEN 'Fornecedores Serviços' WHEN '02' THEN 'Fornecedores Materiais' ELSE 'Não Classificado' END AS exp1) AS [Desc. Class Fornecedor],
      ca.[Date and Time] AS [Data Registo], ca.[User ID] AS [User] 
                                                                                                                                         
    FROM         dbo.[Minha_BD$Vendor]
    cross apply
    (
        select top(1) [User ID], [Entry No_], [Date and Time]
        from dbo.[Minha_BD$Change Log Entry] AS B
        where B.[Primary Key Field 1 Value] = dbo.[Minha_BD$Vendor].[No_]
        ORDER BY B.[Entry No_]
    ) as ca



    Nuno Silva

    quarta-feira, 20 de maio de 2015 15:53