RETORNAR MAIS DE UMA LINHA EM COLUNAS

09/05/2016

0

Boa tarde Pessoal...

Estou com uma dúvida e não estou conseguindo sair desta enrrascada!

Tenho o SELECT abaixo onde faço JOIN em 3 tabelas, porém uma delas a de imagens retorna mais de uma linha, pois dependendo do produto, pode possuir mais de uma imagem.

Gostaria que o retorno ocorresse apenas em uma linha, porém com a quantidade de colunas, retornando o nome da imagem, variando de acordo com a aquantidade de imagens do produto.

Hoje este SELECT repete os mesmos dados de um determinado produto em 5 linhas por exemplo, a mesma quantidade de imagens deste produto. Como retornar apenas uma linha com 5 colunas de imagem?

SELECT TESTE.PRODUTO.cd_produto,
TESTE.PRODUTO.Descricao,
TESTE.IMAGEM.Historico,
TESTE.IMAGEM.tipo_imagem,

FROM TESTE.IMAGEM
INNER JOIN TESTE.PRODUTO ON TESTE.IMAGEM.cd_produto = TESTE.PRODUTO.cd_produto
INNER JOIN TESTE.COMPLEMENTO ON TESTE.PRODUTO.cd_produto = TESTE.COMPLEMENTO.cd_produto


WHERE (TESTE.PRODUTO.Status = 'A')
AND (TESTE.PRODUTO.cd_produto = '4455')
AND (TESTE.IMAGEM.tipo_imagem = 'LOGO')

Ele está retornando:

Cd_produto Descricao imagem tipo_imagem
4455 Limpador de Vidros LOGO01.JPG LOGO
4455 Limpador de Vidros LOGO02.JPG LOGO
4455 Limpador de Vidros LOGO03.JPG LOGO
4455 Limpador de Vidros LOGO04.JPG LOGO

E gostaria que retornasse:

Cd_produto Descricao imagem 1 imagem 2 imagem 3 imagem 4 tipo_imagem
4455 Limpador de Vidros LOGO01.JPG LOGO02.JPG LOGO03.JPG LOGO04.JPG LOGO

Como fazer isto?

Obrigado.
Responder

Posts

10/05/2016

Raylan Zibel

Como você vai processar esse resultado, sabendo que poderia ter N colunas?
Responder

10/05/2016

Frb

Na verdade há um limite de colunas, seria o máximo de 6 colunas de contendo o nome das imagens. O processamento disto na verdade irá gerar um relatório, como um mapa dos produtos e suas respectivas imagens.
Responder

10/05/2016

Isaac Jose

bom dia.
você pode utilizar para isso o CASE WHEN , PIVOT ou SubSelects..

qualquer coisa envie scripts com a montagem das tabelas e alguns inserts que monto algo.

att.
Isaac
Responder

10/05/2016

Frb

Bom dia Issac,


Segue abaixo os scrips de criação das tabelas e inserts. Mas é algo bem simples mesmo. criei tabelas de exemplo, pois ao resolver este problema que não consegui até agora poderei de fato fazer o que preciso com tabelas bem mais complexas que estas.



Obrigado!






CREATE TBCOMPLEMENTO
USE [HOMOLOG]
GO

/****** Object: Table [dbo].[TBCOMPLEMENTO] Script Date: 05/10/2016 11:44:03 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[TBCOMPLEMENTO](
[cd_produto] [char](12) NOT NULL,
[cd_detalhe] [char](25) NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


CREATE TBIMAGEM

USE [HOMOLOG]
GO

/****** Object: Table [dbo].[TBIMAGEM] Script Date: 05/10/2016 11:45:09 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[TBIMAGEM](
[cd_produto] [char](12) NOT NULL,
[cd_imagem] [char](25) NULL,
[tipo_imagem] [char](25) NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


CREATE TBPRODUTO

USE [HOMOLOG]
GO

/****** Object: Table [dbo].[TBPRODUTO] Script Date: 05/10/2016 11:45:50 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[TBPRODUTO](
[cd_produto] [char](12) NOT NULL,
[Descricao] [char](25) NULL
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO



INSERTS

INSERT INTO [HOMOLOG].[dbo].[TBCOMPLEMENTO]
([cd_produto]
,[cd_detalhe]
)
VALUES
( '4455'
, '1L'
),
('4456', '1KG')
GO


INSERT INTO [HOMOLOG].[dbo].[TBPRODUTO]
([cd_produto]
,[Descricao]
)
VALUES
( '4455'
, 'Limpador de Vidros'
),
('4456', 'Sabao em Po')
GO


INSERT INTO [HOMOLOG].[dbo].[TBIMAGEM]
([cd_produto]
,[cd_imagem]
,[tipo_imagem]
)
VALUES
( '4455'
, 'IMAGEM4455'
, 'LOGO'
),
( '4455'
, 'IMAGEM4455_1'
, 'IMG_FRENTE'
),
( '4455'
, 'IMAGEM4455_2'
, 'IMG_VERSO'
),
( '4455'
, 'IMAGEM4455_3'
, 'IMG_LATERAL'
)
,
( '4456'
, 'IMAGEM4456'
, 'LOGO'
),
( '4456'
, 'IMAGEM4456_1'
, 'IMG_FRENTE'
),
( '4456'
, 'IMAGEM4456_2'
, 'IMG_VERSO'
),
( '4456'
, 'IMAGEM4456_3'
, 'IMG_LATERAL'
)

GO


Vlw!
Responder

10/05/2016

Isaac Jose

boa tarde.

segue um exemplo de como pode ser feito.
se possível estruture melhor seu banco . schema dbo é o padrão tente fazer politica de Schemas com acessos para cada um por perfil de usuário.
outra coisa sua tabela de imagens é confusa. vc tem o código do produto e mesmo assim o repete no cd_imagem coloque uma numeração para cada um de 1 a 6 que é sua qtd max assim seu case ficara somente do 1 ao 6 caso contrario terá que fazer 1 case para cada img de cada produto o que inviabiliza seu trabalho..
----- SEU CASO
SELECT
MAX(A.cd_produto)cd_produto,MAX(A.cd_detalhe)cd_detalhe ,
MAX(A.Descricao)Descricao, MAX(A.IMAGEM4455)IMAGEM4455,
MAX(A.IMAGEM4455_1)IMAGEM4455_1
FROM
(
SELECT DISTINCT
IMAGEM4455 = CASE WHEN B.cd_imagem = 'IMAGEM4455' THEN 'IMAGEM4455'

END,
IMAGEM4455_1 = CASE WHEN B.cd_imagem = 'IMAGEM4455_1' THEN 'IMAGEM4455_1'

END,

a.cd_produto,a.cd_detalhe,C.Descricao

FROM producao.TBCOMPLEMENTO a
LEFT JOIN producao.TBIMAGEM B
ON B.cd_produto = A.cd_produto
LEFT JOIN producao.TBPRODUTO C
ON C.cd_produto = A.cd_produto) AS A
GROUP BY A.Descricao



---- IDEAL

SELECT
MAX(A.cd_produto)cd_produto,MAX(A.cd_detalhe)cd_detalhe ,
MAX(A.Descricao)Descricao, MAX(A.IMG1)'1',
MAX(A.IMG2)'2'
FROM
(
SELECT DISTINCT
IMG1 = CASE WHEN B.cd_imagem = 1 THEN 1
END,
IMG2 = CASE WHEN B.cd_imagem = 2 THEN 2
END,

a.cd_produto,a.cd_detalhe,C.Descricao

FROM producao.TBCOMPLEMENTO a
LEFT JOIN producao.TBIMAGEM B
ON B.cd_produto = A.cd_produto
LEFT JOIN producao.TBPRODUTO C
ON C.cd_produto = A.cd_produto) AS A
GROUP BY A.Descricao


espero que ajude.


att.

Isaac.
Responder

11/05/2016

Frb

Ok. Isaac, porém mais uma dúvida surgiu. Tenho ainda um erro de conversão:

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'D:\IMAGENS\IMAGEM4455'


Não estou entendendo em que momento devo fazer a conversão. Ou se devo declarar antes para poder converter.
Responder

11/05/2016

Isaac Jose

boa tarde..
esse código foi feito sobre os valores que você mandou as tabelas que vc esta realizando a consulta deve ter outros valores não tenho como avaliar isso.


mais tenta assim



PERC_EMISSOES =
CASE WHEN A.META = 0 THEN 0 ELSE cast((SUM(A.EMISSOES)/MAX(A.META))as FLOAT)*100 END
Responder

11/05/2016

Frb

Ok. entendido. É que na verdade ao invés de do nome da imagem como enviei no DB tenho armazenado o endereço dela e este relatório retornará a imagem e não o caminho. então apenas para exemplo passei os nomes das imagens e não o que realmente está na base que é o endereço delas+ o nome da imagem.
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar