Array
(
)

RETORNAR MAIS DE UMA LINHA EM COLUNAS

Frb
   - 09 mai 2016

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.

Raylan
|
MVP
Pontos: 690
    10 mai 2016

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

Frb
   - 10 mai 2016

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.

Isaac Jose
   - 10 mai 2016

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

Frb
   - 10 mai 2016

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!

Isaac Jose
   - 10 mai 2016

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.

Frb
   - 11 mai 2016

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.

Isaac Jose
   - 11 mai 2016

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

Frb
   - 11 mai 2016

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.