Arquivos de Tag: DQL

Utilizando CASE com IN no SQL Server

No SQL Server, é possível utilizar o recurso IN dentro de um Case.

Para ilustrar o exemplo, utilizamos o banco de dados Adventure Works 2008, e primeiro podemos observar o uso típico do case:

SELECT	ProductID, 
	Name, 
	Color,
	case Color 
	    when 'Red'    then 'Cor Primaria'
	    when 'Blue'   then 'Cor Primaria'
	    when 'Yellow' then 'Cor Primaria'
	    else 'Cor Secundaria'
	end as TesteCase
FROM	Production.Product
WHERE	Color is not null

Temos o seguinte resultado:

ScreenHunter_440 Jan. 17 08.49

Observamos que para o caso das cores serem Red, Blue e Yellow, os resultados seriam os mesmos.

Podemos fazer a alteração utilizando o comando IN dentro do Case, como o código seguinte:

SELECT	ProductID, 
	Name, 
	Color,
	case WHEN 
	    Color in ('Red','Blue','Yellow') then 'Cor Primaria'
	    else 'Cor Secundaria'
	end as TesteCase
FROM	Production.Product
WHERE	Color is not null

Observamos que conseguimos otimizar a escrita do código, não ficando tão repetitivo, tendo o mesmo resultado:

ScreenHunter_440 Jan. 17 08.49

Anúncios

Concatenação de uma única linha com origem de várias linhas retornadas em T-SQL

É possível utilizar o recurso em T-SQL para que várias linhas retornadas em uma select sejam concatenadas em uma única.

O cenário utilizado foi por exemplo, em impressão de etiquetas, que um produto produzido foi consumido x produtos com y quantidades.

Utilizamos no exemplo o Banco de Dados AdventureWorks2008 do SQL Server, a qual pode ser adaptado facilmente para qualquer versão que voce esteja utilizando.

Select P.Name
       +' - Tkg '+ SOD.CarrierTrackingNumber
       +' - Qty '+ CONVERT(VARCHAR, SOD.OrderQty)
       +' - Prc '+ CONVERT(VARCHAR, SOD.UnitPrice)
From   Sales.SalesOrderDetail SOD
         inner join Production.Product P
           on P.ProductID = SOD.ProductID
Where SalesOrderID = 43664

O seguinte resultado irá aparecer, sendo um resiltado simples que já estamos acostumados.

ScreenHunter_334 Jul. 25 10.43

O problema é que o gerador de relatório estava interpretando que cada linha do SQL estava sendo colocado um uma folha. Para isso, precisávamos colocar todas as linhas retornadas em uma única (como se fosse uma única string). Para isso, executamos o seguinte comando:

Select STUFF((SELECT DISTINCT ' ' +
		P.Name  
		+' - Tkg '+ SOD.CarrierTrackingNumber 
	  	+' - Qty '+  CONVERT(VARCHAR, SOD.OrderQty) 
		+' - Prc '+  CONVERT(VARCHAR, SOD.UnitPrice) + CHAR(10)
From Sales.SalesOrderDetail SOD
	inner join Production.Product P
		on P.ProductID = SOD.ProductID
Where SalesOrderID = 43664
FOR XML PATH('')),1,1,'')

O seguinte resultado foi apresentado:

ScreenHunter_335 Jul. 25 10.44

Precisamos colocar o CHAR(10) para que o gerador de relatório interpresse esse código como <Enter>, colocando assim cada uma das linhas em uma linha separada no relatório (diferente do retorno de várias linhas do SQL).

Dessa forma, fizemos que esse campo retornasse um MEMO para o gerador de relatório.

 

 

 

Aprendendo Programação

Algorítmos, Linguagem C, C++,Pascal, Python

WikiDBA

by Virendra Yaduvanshi - Microsoft SQL Server Database Architect | Consultant | Blogger | Specialist | DBA | Speaker

Blog - Fabiano Neves Amorim

SELECT * FROM [Coisas Da Minha Cabeça] WHERE dbo.fn_TempoParaPost() < dbo.fn_TempoLivre()

ROMANO DBA

Administração de Bancos de Dados

Tércio Costa, Oracle Developer, OCE SQL

Guia de estudos para certificação ORACLE SQL Expert(1Z0-047) e PL/SQL(1Z0-144)

Strate SQL

Data Adventures with an Architect