RETORNAR MAIS DE UMA LINHA EM COLUNAS
09/05/2016
0
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.
Frb
Posts
10/05/2016
Raylan Zibel
10/05/2016
Frb
10/05/2016
Isaac Jose
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
10/05/2016
Frb
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!
10/05/2016
Isaac Jose
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.
11/05/2016
Frb
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.
11/05/2016
Isaac Jose
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
11/05/2016
Frb
Clique aqui para fazer login e interagir na Comunidade :)