<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:georss="http://www.georss.org/georss" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>SQL From Hell.com</title>
	<atom:link href="https://sqlfromhell.wordpress.com/feed/" rel="self" type="application/rss+xml"/>
	<link>https://sqlfromhell.wordpress.com</link>
	<description>Um nome bem intuitivo para muita informação!</description>
	<lastBuildDate>Sat, 16 Jun 2018 16:49:44 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<site xmlns="com-wordpress:feed-additions:1">7423972</site><cloud domain="sqlfromhell.wordpress.com" path="/?rsscloud=notify" port="80" protocol="http-post" registerProcedure=""/>
<image>
		<url>https://secure.gravatar.com/blavatar/737172c3f96660d4c94947533af50f3e620190a1e7ca8508ed3167773cca957a?s=96&amp;d=https%3A%2F%2Fs0.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>SQL From Hell.com</title>
		<link>https://sqlfromhell.wordpress.com</link>
	</image>
	<atom:link href="https://sqlfromhell.wordpress.com/osd.xml" rel="search" title="SQL From Hell.com" type="application/opensearchdescription+xml"/>
	<atom:link href="https://sqlfromhell.wordpress.com/?pushpress=hub" rel="hub"/>
	<itunes:explicit>no</itunes:explicit><itunes:subtitle>Um nome bem intuitivo para muita informação!</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Software How-To"/></itunes:category><item>
		<title>Hello, World!</title>
		<link>https://sqlfromhell.wordpress.com/2018/03/16/hello-world/</link>
					<comments>https://sqlfromhell.wordpress.com/2018/03/16/hello-world/#respond</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Sat, 17 Mar 2018 00:39:43 +0000</pubDate>
				<category><![CDATA[Sem Categoria]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4492</guid>

					<description><![CDATA[SQL From Hell, você está vivo ainda? Sim, eu acho. Mesmo depois de passar pelo mestrado, de trabalhar fixo em duas empresas e consultorias, de ficar um ano e pouco &#8216;parado&#8217; por problemas de saúde. Estou vivo e estudando muito. Parou com o blog? Sim, mas tenho uma infinidade de coisas para escrever, com o [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>SQL From Hell, você está vivo ainda? Sim, eu acho. Mesmo depois de passar pelo mestrado, de trabalhar fixo em duas empresas e consultorias, de ficar um ano e pouco &#8216;parado&#8217; por problemas de saúde. Estou vivo e estudando muito.</p>
<p><strong>Parou com o blog?</strong> Sim, mas tenho uma infinidade de coisas para escrever, com o OneDrive e o OneNote com vários rabiscos de artigos que não cheguei a publicar.</p>
<p><strong>Vai voltar a escrever no blog?</strong> Sim, mas o blog do <a href="https://sqlfromhell.wordpress.com" target="_blank" rel="noopener">WordPress</a> vai ficar mais um tempo parado, pois quero utilizar melhor o domínio <a href="http://www.sqlfromhell.com">SQL From Hell</a>, youtube, facebook&#8230;</p>
<p><strong>Vai escrever sobre SQL?</strong> Sim, também outras coisas do meu interesse. Pois SQL é só uma das várias coisas que eu gosto muito.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2018/03/16/hello-world/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4492</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	</item>
		<item>
		<title>Número de registros de todas tabelas de um banco de dados (SQL Azure)</title>
		<link>https://sqlfromhell.wordpress.com/2015/05/03/numero-de-registros-de-todas-tabelas-de-um-banco-de-dados-sql-azure/</link>
					<comments>https://sqlfromhell.wordpress.com/2015/05/03/numero-de-registros-de-todas-tabelas-de-um-banco-de-dados-sql-azure/#respond</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Sun, 03 May 2015 11:20:36 +0000</pubDate>
				<category><![CDATA[Dicionários de dados]]></category>
		<category><![CDATA[SQL Azure]]></category>
		<category><![CDATA[CLUSTERED]]></category>
		<category><![CDATA[COUNT(*)]]></category>
		<category><![CDATA[HEAP]]></category>
		<category><![CDATA[Microsoft SQL Azure]]></category>
		<category><![CDATA[rows]]></category>
		<category><![CDATA[sys.indexes]]></category>
		<category><![CDATA[sys.partitions]]></category>
		<category><![CDATA[sys.schemas]]></category>
		<category><![CDATA[sys.tables]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4471</guid>

					<description><![CDATA[Atenção Migramos este artigo para o novo site: http://www.sqlfromhell.com/numero-de-linhas-de-todas-tabelas-de-um-banco-de-dados-do-azure/          ]]></description>
										<content:encoded><![CDATA[<h1 style="text-align:center;">Atenção</h1>
<h3 style="text-align:center;">Migramos este artigo para o novo site:</h3>
<h3 style="text-align:center;"><a title="Número de linhas de todas tabelas de um banco de dados do Azure" href="http://www.sqlfromhell.com/numero-de-linhas-de-todas-tabelas-de-um-banco-de-dados-do-azure/"><img src="https://i0.wp.com/www.sqlfromhell.com/wp-content/uploads/2018/04/T-Tips.jpg">http://www.sqlfromhell.com/numero-de-linhas-de-todas-tabelas-de-um-banco-de-dados-do-azure/</a></h3>
<p> <br />
 <br />
 <br />
 <br />
 </p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2015/05/03/numero-de-registros-de-todas-tabelas-de-um-banco-de-dados-sql-azure/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4471</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content medium="image" url="http://www.sqlfromhell.com/wp-content/uploads/2018/04/T-Tips.jpg"/>
	</item>
		<item>
		<title>Gerando o script de CREATE LOGIN com os SIDs</title>
		<link>https://sqlfromhell.wordpress.com/2013/12/03/gerando-o-script-de-create-login-com-os-sids/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/12/03/gerando-o-script-de-create-login-com-os-sids/#comments</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Tue, 03 Dec 2013 23:04:06 +0000</pubDate>
				<category><![CDATA[Manutenção]]></category>
		<category><![CDATA[Scripts]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[CREATE LOGIN]]></category>
		<category><![CDATA[migração]]></category>
		<category><![CDATA[sid]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4422</guid>

					<description><![CDATA[Atenção Migramos este artigo para o novo site: http://www.sqlfromhell.com/usuarios-orfaos-gerando-o-script-de-create-login-com-os-sids/ &#160; &#160; &#160; &#160; &#160;]]></description>
										<content:encoded><![CDATA[<h1 style="text-align:center;">Atenção</h1>
<h3 style="text-align:center;">Migramos este artigo para o novo site:</h3>
<h3 style="text-align:center;"><a title="Usuários órfãos – Gerando o script de CREATE LOGIN com os SIDs" href="http://www.sqlfromhell.com/usuarios-orfaos-gerando-o-script-de-create-login-com-os-sids/"><img src="https://i0.wp.com/www.sqlfromhell.com/wp-content/uploads/2018/04/T-Seguranca-Usuario.jpg">http://www.sqlfromhell.com/usuarios-orfaos-gerando-o-script-de-create-login-com-os-sids/</a></h3>
<p>&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/12/03/gerando-o-script-de-create-login-com-os-sids/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4422</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content medium="image" url="http://www.sqlfromhell.com/wp-content/uploads/2018/04/T-Seguranca-Usuario.jpg"/>
	</item>
		<item>
		<title>Márcio Gomes vs SQL – Fight 2</title>
		<link>https://sqlfromhell.wordpress.com/2013/10/21/marcio-gomes-vs-sql-fight-2/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/10/21/marcio-gomes-vs-sql-fight-2/#comments</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Mon, 21 Oct 2013 23:55:35 +0000</pubDate>
				<category><![CDATA[Márcio Gomes vs SQL]]></category>
		<category><![CDATA[Query 4 Fun]]></category>
		<category><![CDATA[Query From Hell]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4417</guid>

					<description><![CDATA[Se você tem menos de 18 anos, ou sofre de problemas cardíacos, ou não tem certeza sobre suas convicções religiosas, ou não manja de UPDATE, então NÃO PROSSIGA. Eu e o Márcio Gomes, em uma discussão sobre SQL (o que nunca dá bons resultados), nos deparamos com o bendito do &#8216;WHERE 1=1&#8217;, que em um [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Se você tem menos de 18 anos, ou sofre de problemas cardíacos, ou não tem certeza sobre suas convicções religiosas, ou não manja de UPDATE, então NÃO PROSSIGA.</strong></p>
<p><a title="Paulo Roberto Pereira Junior" href="https://sqlfromhell.wordpress.com/who/" target="_blank">Eu</a> e o <a title="Márcio Luiz Rossato Gomes" href="http://br.linkedin.com/in/marciogomes1980/" target="_blank">Márcio Gomes</a>, em uma discussão sobre SQL (o que nunca dá bons resultados), nos deparamos com o bendito do &#8216;WHERE 1=1&#8217;, que em um momento de insanidade transformamos em &#8216;WHERE SQRT(SQUARE(1 + 1)) * 3 = 6&#8217;. Para testar o fruto desta capacidade criativa, optamos por comparar planos de execução, de uma query sem WHERE, outra com o &#8216;WHERE 1=1&#8217; e outra com &#8216;WHERE SQRT(SQUARE(1 + 1)) * 3 = 6&#8217;.</p>
<p>Veja como &#8216;WHERE SQRT(SQUARE(1 + 1)) * 3 = 6&#8217; tem menor custo que as outras consultas: #sqn</p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/10/102113_2355_mrciogomesv1.png?w=645" /></p>
<p><strong>Enganamos o plano de execução do SQL? Onde está seu deus agora?</strong></p>
<p>Para quem duvida, segue o script:</p>
<pre class="brush: sql; title: ; notranslate">CREATE TABLE T (ID INT NOT NULL, TXT CHAR(32) NOT NULL)

;WITH CTE (ID) AS (
SELECT 1
UNION ALL
SELECT ID + 1 FROM CTE WHERE ID &lt; 100000
)

INSERT INTO T
SELECT ID, REPLICATE('0', 32) FROM CTE
OPTION (MAXRECURSION 0)

UPDATE T SET ID = 1
UPDATE T SET ID = 1 WHERE 1 = 1
UPDATE T SET ID = 1 WHERE SQRT(SQUARE(1 + 1)) * 3 = 6</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/10/21/marcio-gomes-vs-sql-fight-2/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4417</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/10/102113_2355_mrciogomesv1.png"/>
	</item>
		<item>
		<title>Transformando colunas em linhas sem UNPIVOT</title>
		<link>https://sqlfromhell.wordpress.com/2013/09/12/transformando-colunas-em-linhas-sem-unpivot/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/09/12/transformando-colunas-em-linhas-sem-unpivot/#comments</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Thu, 12 Sep 2013 20:23:35 +0000</pubDate>
				<category><![CDATA[Introdução]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[CROSS APPLY]]></category>
		<category><![CDATA[PIVOT]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[UNPIVOT]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4406</guid>

					<description><![CDATA[Olá pessoas, Após conhecer um pouco do UNPIVOT, percebe-se que este comando não é muito flexível, mesmo sendo um pouco mais maleável que o comando PIVOT. Por desconhecer este comando, ou pela falta de flexibilidade, é comum encontrar outras alternativas para ‘transformar colunas em linhas’, como o exemplo abaixo: Esta estratégia com UNION ALL requer [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Olá pessoas,</p>
<p>Após conhecer um pouco do <a title="Transformando colunas em linhas com UNPIVOT" href="https://sqlfromhell.wordpress.com/2013/08/15/transformando-colunas-em-linhas-com-unpivot/" target="_blank">UNPIVOT</a>, percebe-se que este comando não é muito flexível, mesmo sendo um pouco mais maleável que o comando <a title="Transformando linhas em colunas com PIVOT" href="https://sqlfromhell.wordpress.com/2013/07/18/transformando-linhas-em-colunas-com-pivot/" target="_blank">PIVOT</a>. Por desconhecer este comando, ou pela falta de flexibilidade, é comum encontrar outras alternativas para ‘transformar colunas em linhas’, como o exemplo abaixo:</p>
<pre class="brush: sql; title: ; notranslate">
-- Criando uma tabela de teste:

DECLARE @CONTAS TABLE (
    [BANCO] VARCHAR(100),
    [ANO] SMALLINT,
    [INVESTIMENTOS] MONEY,
    [DESPESAS] MONEY
)

INSERT INTO @CONTAS VALUES
('BANCO ALVORADA S/A', 2010, 9613906084.01, 8102644.84),
('BANCO ALVORADA S/A', 2011, 174343.35, 7935411.15),
('BANCO ARBI S/A', 2010, 8202652.29, 114215.13),
('BANCO ARBI S/A', 2011, 8407843.72, 81746.25)

-- Uso do UNION ALL para transformar colunas em linhas:

SELECT [BANCO], [ANO], 'INVESTIMENTOS' AS [TIPO], C.[INVESTIMENTOS] AS [VALOR] FROM @CONTAS C
UNION ALL
SELECT [BANCO], [ANO], 'DESPESAS' AS [TIPO], C.[DESPESAS] AS [VALOR] FROM @CONTAS C
ORDER BY [BANCO], [ANO], [TIPO]
</pre>
<p>Esta estratégia com UNION ALL requer uma leitura da tabela a mais para cada coluna transformada em linha, ou seja, a tabela no exemplo acima foi lida duas vezes para obter o mesmo resultado que poderia ser obtido lendo a tabela uma única vez com UNPIVOT:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT [BANCO], [ANO], [TIPO], [VALOR]
FROM @CONTAS C
UNPIVOT (
    [VALOR] FOR [TIPO] IN (
        [INVESTIMENTOS],
        [DESPESAS]
    )
) AS U
ORDER BY [BANCO], [ANO], [TIPO]
</pre>
<p>Com o STATISTICS IO, podemos obter as seguintes informações:</p>
<p><em><strong>Consulta com UNION ALL:</strong></em></p>
<p><em>(8 row(s) affected)</em><br />
<em> Table &#8216;#A255182D&#8217;. Scan count 2, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.</em></p>
<p><em><strong>Consulta com UNPIVOT:</strong></em></p>
<p><em>(8 row(s) affected)</em><br />
<em> Table &#8216;#A255182D&#8217;. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.</em></p>
<p>Mas como obter flexibilidade, tendo um número de leituras semelhante ao UNPIVOT, e até mesmo ter um plano de execução um pouco melhor?</p>
<p>A resposta pode ser encontrada no CROSS APPLY – que para quem não conhece, este comando funciona de forma um pouco semelhante ao JOIN, executando uma determinada subquery para cada registro da tabela com a qual ele faz o ‘JOIN’ –, que pode ser utilizado com UNION ALL para transformar colunas em linhas:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT [BANCO], [ANO], [TIPO], [VALOR]
FROM @CONTAS C

CROSS APPLY (
    SELECT 'INVESTIMENTOS' AS [TIPO], C.[INVESTIMENTOS] AS [VALOR]
    UNION ALL
    SELECT 'DESPESAS' AS [TIPO], C.[DESPESAS] AS [VALOR]
)
AS U

ORDER BY [BANCO], [ANO], [TIPO]
</pre>
<p>Ou combinado ao VALUES:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT [BANCO], [ANO], [TIPO], [VALOR]
FROM @CONTAS C

CROSS APPLY (
    VALUES
    ('INVESTIMENTOS', C.[INVESTIMENTOS]),
    ('DESPESAS', C.[DESPESAS])
)
AS U ([TIPO], [VALOR])

ORDER BY [BANCO], [ANO], [TIPO]
</pre>
<p>Em breve, vou publicar um comparativo mais detalhado entre o UNPIVOT e o CROSS APPLY!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/09/12/transformando-colunas-em-linhas-sem-unpivot/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4406</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	</item>
		<item>
		<title>Novo Tema do Blog</title>
		<link>https://sqlfromhell.wordpress.com/2013/09/04/novo-tema-do-blog/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/09/04/novo-tema-do-blog/#respond</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Wed, 04 Sep 2013 19:07:25 +0000</pubDate>
				<category><![CDATA[Sem Categoria]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4390</guid>

					<description><![CDATA[O pessoal do wordpress matou o antigo tema do blog (aka. Redoable Lite), deixando o blog fora do ar, me obrigando a mudar de tema. Acho que ficou bom até este novo tema (aka. Superhero). Espero que não matem este tema também&#8230;]]></description>
										<content:encoded><![CDATA[<p>O pessoal do wordpress matou o antigo tema do blog (aka. Redoable Lite), deixando o blog fora do ar, me obrigando a mudar de tema.</p>
<p>Acho que ficou bom até este novo tema (aka. Superhero).</p>
<p>Espero que não matem este tema também&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/09/04/novo-tema-do-blog/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4390</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	</item>
		<item>
		<title>Márcio Gomes vs SQL – Fight 1</title>
		<link>https://sqlfromhell.wordpress.com/2013/09/04/marcio-gomes-vs-sql/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/09/04/marcio-gomes-vs-sql/#comments</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Wed, 04 Sep 2013 17:41:59 +0000</pubDate>
				<category><![CDATA[Márcio Gomes vs SQL]]></category>
		<category><![CDATA[Query 4 Fun]]></category>
		<category><![CDATA[Query From Hell]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[Marcio Gomes]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4373</guid>

					<description><![CDATA[Olá pessoas, A partir desta semana, o Márcio Gomes terá um espaço para expressar todo seu amor ao SQL, então boa diversão! SQL Go To Hell&#8230; PLZ! por Márcio Gomes Antes de tudo eu gostaria de agradecer ao Paulo pelo espaço cedido no SQL FROM HELL, não existe lugar melhor na internet para eu expressar [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Olá pessoas,</p>
<p>A partir desta semana, o <a title="Márcio Luiz Rossato Gomes" href="http://br.linkedin.com/in/marciogomes1980/" target="_blank">Márcio Gomes</a> terá um espaço para expressar todo seu amor ao SQL, então boa diversão!</p>
<h2>SQL Go To Hell&#8230; PLZ!</h2>
<h4><i><a title="Márcio Luiz Rossato Gomes" href="http://br.linkedin.com/in/marciogomes1980/" target="_blank">por Márcio Gomes</a></i></h4>
<p>Antes de tudo eu gostaria de agradecer ao Paulo pelo espaço cedido no SQL FROM HELL, não existe lugar melhor na internet para eu expressar meus sentimentos em relação ao SQL.</p>
<p>Que eu ODEIO SQL todo mundo sabe, no entanto o que pouca gente sabe é que o SQL ME ODEIA! Sim&#8230; essa relação de guerra e paz começou em 2002 e segue até hoje e posso garantir com todas as letras, o SQL não perde uma única chance de me sacanear, quando tudo parece que vai dar certo de repente algo sobrenatural acontece e somente recorrendo à ajuda do Paulo combinado com duas velas pretas na encruzilhada as coisas voltam ao normal.</p>
<p>Hoje como é a estreia dos relatos sobre a guerra cotidiana tentando sobreviver aos ataques terroristas do SQL Server deixo um print screen mostrando que o .NET Framework concorda comigo.</p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/09/090413_1741_mrciogomesv1.jpg?w=645" /></p>
<p>Exatamente isto que você leu meu caro amigo &#8220;NO BANDO DE DADOS&#8221; (sic), o SQL é uma espécie de clã, horda, bando de dados armados que criam batalhas digitais que nos post futuros serão descritas aqui no SQL FROM HELL!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/09/04/marcio-gomes-vs-sql/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4373</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/09/090413_1741_mrciogomesv1.jpg"/>
	</item>
		<item>
		<title>Como validar CPF e CNPJ no SQL Server</title>
		<link>https://sqlfromhell.wordpress.com/2013/08/29/como-validar-cpf-e-cnpj-no-sql-server/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/08/29/como-validar-cpf-e-cnpj-no-sql-server/#comments</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Thu, 29 Aug 2013 22:26:19 +0000</pubDate>
				<category><![CDATA[Funções SQL]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Validação de CNPJ e CPF]]></category>
		<category><![CDATA[Validar]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4365</guid>

					<description><![CDATA[E ai pessoas, revisando o script de validação de CPF e CNPJ em T-SQL que adaptei em 2009, encontrei algumas melhorias pra deixá-lo mais limpo, espero que gostem: E o script para criar uma função de validação de CPF e CNPJ: E um segundo script para criar uma função de validação de CPF e CNPJ, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>E ai pessoas, revisando o <a href="https://sqlfromhell.wordpress.com/2009/11/19/validacao-de-cnpj-e-cpf/" title="FUNÇÕES: Validação de CNPJ e CPF com T-SQL">script de validação de CPF e CNPJ em T-SQL</a> que adaptei em 2009, encontrei algumas melhorias pra deixá-lo mais limpo, espero que gostem:</p>
<pre class="brush: sql; title: ; notranslate">DECLARE @TEXTO VARCHAR(20) = '02.841.834/0001-55'
 
DECLARE @CPF_CNPJ VARCHAR(20) = ''
 
;WITH SPLIT AS
(
	SELECT 1 AS ID, SUBSTRING(@TEXTO, 1, 1) AS LETRA
	UNION ALL
	SELECT ID + 1, SUBSTRING(@TEXTO, ID + 1, 1)
	FROM SPLIT
	WHERE ID &lt; LEN(@TEXTO)
)
 
SELECT @CPF_CNPJ += LETRA
FROM SPLIT
WHERE LETRA LIKE '[0-9]'
OPTION(MAXRECURSION 0)
 
IF LEN(@CPF_CNPJ) NOT IN (11, 14)
BEGIN
	SELECT 'Inválido'
	RETURN
END

DECLARE
	@I INT,
	@J INT = 1,
	@N INT = LEN(@CPF_CNPJ),
	@DIGITO1 INT = SUBSTRING(@CPF_CNPJ, LEN(@CPF_CNPJ) - 1, 1),
	@DIGITO2 INT = SUBSTRING(@CPF_CNPJ, LEN(@CPF_CNPJ), 1),
	@TOTAL_TMP INT,
	@COEFICIENTE_TMP INT,
	@DIGITO_TMP INT,
	@VALOR_TMP INT,
	@VALOR1 INT,
	@VALOR2 INT
 
WHILE @J &lt;= 2
BEGIN
	SELECT
		@TOTAL_TMP = 0,
		@COEFICIENTE_TMP = 2,
		@I = @N + @J - 3
	
	WHILE @I &gt;= 0
	BEGIN
		SELECT
			@DIGITO_TMP = SUBSTRING(@CPF_CNPJ, @I, 1),
			@TOTAL_TMP += @DIGITO_TMP * @COEFICIENTE_TMP,
			@COEFICIENTE_TMP = @COEFICIENTE_TMP + 1,
			@I -= 1
 
		IF @COEFICIENTE_TMP &gt; 9 AND @N = 14
			SET @COEFICIENTE_TMP = 2
	END
 
	SET @VALOR_TMP = 11 - (@TOTAL_TMP % 11)
 
	IF (@VALOR_TMP &gt;= 10)
		SET @VALOR_TMP = 0
 
	IF @J = 1
		SET @VALOR1 = @VALOR_TMP
	ELSE
		SET @VALOR2 = @VALOR_TMP

	SET @J += 1
END
 
SELECT
	CASE WHEN @VALOR1 = @DIGITO1 AND @VALOR2 = @DIGITO2
		THEN 'Válido'
		ELSE 'Inválido'
	END</pre>
<p>E o script para criar uma função de validação de CPF e CNPJ:</p>
<pre class="brush: sql; title: ; notranslate">CREATE FUNCTION [dbo].[UDF_ValidaCpfCnpj] (@TEXTO VARCHAR(20))
RETURNS BIT
AS 
BEGIN 
	DECLARE @CPF_CNPJ VARCHAR(20) = ''
 
	;WITH SPLIT AS
	(
		SELECT 1 AS ID, SUBSTRING(@TEXTO, 1, 1) AS LETRA
		UNION ALL
		SELECT ID + 1, SUBSTRING(@TEXTO, ID + 1, 1)
		FROM SPLIT
		WHERE ID &lt; LEN(@TEXTO)
	)
 
	SELECT @CPF_CNPJ += LETRA
	FROM SPLIT
	WHERE LETRA LIKE '[0-9]'
	OPTION(MAXRECURSION 0)
 
	IF LEN(@CPF_CNPJ) NOT IN (11, 14)
	BEGIN
		RETURN 0
	END

	DECLARE
		@I INT,
		@J INT = 1,
		@N INT = LEN(@CPF_CNPJ),
		@DIGITO1 INT = SUBSTRING(@CPF_CNPJ, LEN(@CPF_CNPJ) - 1, 1),
		@DIGITO2 INT = SUBSTRING(@CPF_CNPJ, LEN(@CPF_CNPJ), 1),
		@TOTAL_TMP INT,
		@COEFICIENTE_TMP INT,
		@DIGITO_TMP INT,
		@VALOR_TMP INT,
		@VALOR1 INT,
		@VALOR2 INT
 
	WHILE @J &lt;= 2
	BEGIN
		SELECT
			@TOTAL_TMP = 0,
			@COEFICIENTE_TMP = 2,
			@I = @N + @J - 3
	
		WHILE @I &gt;= 0
		BEGIN
			SELECT
				@DIGITO_TMP = SUBSTRING(@CPF_CNPJ, @I, 1),
				@TOTAL_TMP += @DIGITO_TMP * @COEFICIENTE_TMP,
				@COEFICIENTE_TMP = @COEFICIENTE_TMP + 1,
				@I -= 1
 
			IF @COEFICIENTE_TMP &gt; 9 AND @N = 14
				SET @COEFICIENTE_TMP = 2
		END
 
		SET @VALOR_TMP = 11 - (@TOTAL_TMP % 11)
 
		IF (@VALOR_TMP &gt;= 10)
			SET @VALOR_TMP = 0
 
		IF @J = 1
			SET @VALOR1 = @VALOR_TMP
		ELSE
			SET @VALOR2 = @VALOR_TMP

		SET @J += 1
	END
 
	RETURN
		CASE WHEN @VALOR1 = @DIGITO1 AND @VALOR2 = @DIGITO2
			THEN 1
			ELSE 0
		END
END    
GO

SELECT CASE 
	WHEN [dbo].[UDF_ValidaCpfCnpj] ('02.841.834/0001-55') = 1 
	THEN 'Válido' 
	ELSE 'Inválido' 
	END</pre>
<p>E um segundo script para criar uma função de validação de CPF e CNPJ, considerando que o CPF ou CNPJ que a função vai receber nunca terá caracteres especiais ou mais/menos dígitos que um CPF ou CNPJ possui:</p>
<pre class="brush: sql; title: ; notranslate">CREATE FUNCTION [dbo].[UDF_ValidaCpfCnpj] (@CPF_CNPJ VARCHAR(20))
RETURNS BIT
AS 
BEGIN 
	DECLARE
		@I INT,
		@J INT = 1,
		@N INT = LEN(@CPF_CNPJ),
		@DIGITO1 INT = SUBSTRING(@CPF_CNPJ, LEN(@CPF_CNPJ) - 1, 1),
		@DIGITO2 INT = SUBSTRING(@CPF_CNPJ, LEN(@CPF_CNPJ), 1),
		@TOTAL_TMP INT,
		@COEFICIENTE_TMP INT,
		@DIGITO_TMP INT,
		@VALOR_TMP INT,
		@VALOR1 INT,
		@VALOR2 INT
 
	WHILE @J &lt;= 2
	BEGIN
		SELECT
			@TOTAL_TMP = 0,
			@COEFICIENTE_TMP = 2,
			@I = @N + @J - 3
	
		WHILE @I &gt;= 0
		BEGIN
			SELECT
				@DIGITO_TMP = SUBSTRING(@CPF_CNPJ, @I, 1),
				@TOTAL_TMP += @DIGITO_TMP * @COEFICIENTE_TMP,
				@COEFICIENTE_TMP = @COEFICIENTE_TMP + 1,
				@I -= 1
 
			IF @COEFICIENTE_TMP &gt; 9 AND @N = 14
				SET @COEFICIENTE_TMP = 2
		END
 
		SET @VALOR_TMP = 11 - (@TOTAL_TMP % 11)
 
		IF (@VALOR_TMP &gt;= 10)
			SET @VALOR_TMP = 0
 
		IF @J = 1
			SET @VALOR1 = @VALOR_TMP
		ELSE
			SET @VALOR2 = @VALOR_TMP

		SET @J += 1
	END
 
	RETURN
		CASE WHEN @VALOR1 = @DIGITO1 AND @VALOR2 = @DIGITO2
			THEN 1
			ELSE 0
		END
END    
GO

SELECT 
	CASE WHEN [dbo].[UDF_ValidaCpfCnpj] ('02841834000155') = 1 
	THEN 'Válido' 
	ELSE 'Inválido' 
	END</pre>
<p>Quem tiver alguma dica ou sugestão pra melhorar este script, fique a vontade para deixar seu comentário.</p>
<p><strong>Artigos relacionados:</strong></p>
<p><a href="https://sqlfromhell.wordpress.com/2009/11/19/validacao-de-cnpj-e-cpf/">FUNÇÕES: Validação de CNPJ e CPF com T-SQL</a></p>
<p><a href="https://sqlfromhell.wordpress.com/2009/11/18/somente-numeros-com-cte/">FUNÇÕES: Somente Números (com CTE)</a></p>
<p><a href="https://sqlfromhell.wordpress.com/2009/11/17/somente-numeros-com-while/">FUNÇÕES: Somente Números (com WHILE)</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/08/29/como-validar-cpf-e-cnpj-no-sql-server/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4365</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	</item>
		<item>
		<title>Transformando colunas em linhas com UNPIVOT</title>
		<link>https://sqlfromhell.wordpress.com/2013/08/15/transformando-colunas-em-linhas-com-unpivot/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/08/15/transformando-colunas-em-linhas-com-unpivot/#comments</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Thu, 15 Aug 2013 17:00:40 +0000</pubDate>
				<category><![CDATA[Introdução]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[PIVOT]]></category>
		<category><![CDATA[Pivot Table]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[UNPIVOT]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4319</guid>

					<description><![CDATA[Olá pessoas, O UNPIVOT é um pouco menos conhecido que o PIVOT, por razões óbvias, dentre elas, &#8220;é fácil transformar colunas em linhas&#8221;. Mas isso não limita o fato de quem já está acostumado com PIVOT, também utilize o UNPIVOT como recurso, principalmente por apresentarem sintaxes bem semelhantes. UNPIVOT não utiliza funções de agregação como [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Olá pessoas,</p>
<p>O UNPIVOT é um pouco menos conhecido que o PIVOT, por razões óbvias, dentre elas, &#8220;é fácil transformar colunas em linhas&#8221;. Mas isso não limita o fato de quem já está acostumado com PIVOT, também utilize o UNPIVOT como recurso, principalmente por apresentarem sintaxes bem semelhantes.</p>
<p>UNPIVOT não utiliza funções de agregação como o PIVOT, mas é necessária capacidade abstrair duas colunas, sendo a primeira, a coluna que apresentará o nome da coluna que virou linha, e a segunda, a coluna que apresentará o valor da coluna que virou linha.</p>
<p>Para o primeiro exemplo, temos uma tabela com as colunas INVESTIMENTOS e DESPESAS, e transformo &#8216;investimentos&#8217; e &#8216;despesas&#8217; em valores da coluna TIPO, e os valores destas colunas coloco na coluna VALOR:</p>
<pre class="brush: sql; title: ; notranslate">DECLARE @CONTAS TABLE (
	[BANCO] VARCHAR(100), 
	[ANO] SMALLINT,
	[INVESTIMENTOS] MONEY, 
	[DESPESAS] MONEY
)

INSERT INTO @CONTAS VALUES
('BANCO ALVORADA S/A', 2010, 9613906084.01, 8102644.84),
('BANCO ALVORADA S/A', 2011, 174343.35, 7935411.15),
('BANCO ARBI S/A', 2010, 8202652.29, 114215.13),
('BANCO ARBI S/A', 2011, 8407843.72, 81746.25)

SELECT [BANCO], [ANO], [TIPO], [VALOR]
FROM @CONTAS C
UNPIVOT (
	[VALOR] FOR [TIPO] IN (	
		[INVESTIMENTOS], 
		[DESPESAS]
	)
) AS U
ORDER BY [BANCO], [ANO], [TIPO]</pre>
<p><img title="Transformando colunas em linhas com UNPIVOT" alt="Transformando colunas em linhas com UNPIVOT" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/073013_0122_transforman1.png?w=645" /></p>
<p>Para o segundo exemplo, temos uma tabela com as colunas 2010 e 2011, e transformo &#8216;2010&#8217; e &#8216;2011&#8217; em valores da coluna ANO, e os valores destas colunas coloco na coluna VALOR:</p>
<pre class="brush: sql; title: ; notranslate">DECLARE @CONTAS TABLE (
	[BANCO] VARCHAR(100), 
	[TIPO] VARCHAR(100),
	[2010] MONEY, 
	[2011] MONEY
)

INSERT INTO @CONTAS VALUES
('BANCO ALVORADA S/A', 'INVESTIMENTOS', 9613906084.01, 174343.35),
('BANCO ALVORADA S/A', 'DESPESAS', 8102644.84, 7935411.15),
('BANCO ARBI S/A', 'INVESTIMENTOS', 8202652.29, 8407843.72),
('BANCO ARBI S/A', 'DESPESAS', 114215.13, 81746.25)

SELECT [BANCO], [ANO], [TIPO], [VALOR]
FROM @CONTAS C
UNPIVOT (
	[VALOR] FOR [ANO] IN (	
		[2010], 
		[2011]
	)
) AS U
ORDER BY [BANCO], [ANO], [TIPO]</pre>
<p><img title="Transformando colunas em linhas com UNPIVOT" alt="Transformando colunas em linhas com UNPIVOT" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/073013_0122_transforman2.png?w=645" /></p>
<p>Para este terceiro exemplo, temos colunas juntos os nomes são formados tanto pelo tipo da conta e o ano, o que requer algumas transformações nos valores da coluna CONTA, para identificarmos o ano e o tipo da conta.</p>
<pre class="brush: sql; title: ; notranslate">DECLARE @CONTAS TABLE (
	[BANCO] VARCHAR(100), 
	[INVESTIMENTOS_2010] MONEY, 
	[INVESTIMENTOS_2011] MONEY, 
	[DESPESAS_2010] MONEY, 
	[DESPESAS_2011] MONEY
)

INSERT INTO @CONTAS VALUES
('BANCO ALVORADA S/A', 9613906084.01, 8102644.84, 
174343.35, 7935411.15),
('BANCO ARBI S/A',8202652.29, 114215.13, 
8407843.72, 81746.25)

SELECT [BANCO], 
[ANO] = RIGHT([CONTA], CHARINDEX('_', REVERSE([CONTA])) - 1), 
[TIPO] = LEFT([CONTA], CHARINDEX('_', [CONTA]) - 1), 
[VALOR]
FROM @CONTAS C
UNPIVOT (
	[VALOR] FOR [CONTA] IN (	
		[INVESTIMENTOS_2010], 
		[INVESTIMENTOS_2011], 
		[DESPESAS_2010], 
		[DESPESAS_2011]
	)
) AS U
ORDER BY [BANCO], [ANO], [TIPO]</pre>
<p><img title="Transformando colunas em linhas com UNPIVOT" alt="Transformando colunas em linhas com UNPIVOT" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/073013_0122_transforman3.png?w=645" /></p>
<p>Agora, neste quarto exemplo, temos a transformação de diversas colunas em registros, o que requer unicamente que estas colunas sejam do mesmo tipo, no caso VARCHAR(100), para não dar o erro:</p>
<p><span style="color:gray;"><em>The type of column &#8220;xxxxx&#8221; conflicts with the type of other columns specified in the UNPIVOT list.<br />
</em></span></p>
<pre class="brush: sql; title: ; notranslate">DECLARE @CONTAS TABLE (
	[BANCO] VARCHAR(100), 
	[ANO] SMALLINT,
	[INVESTIMENTOS] MONEY, 
	[DESPESAS] MONEY
)

INSERT INTO @CONTAS VALUES
('BANCO ALVORADA S/A', 2010, 9613906084.01, 8102644.84),
('BANCO ALVORADA S/A', 2011, 174343.35, 7935411.15),
('BANCO ARBI S/A', 2010, 8202652.29, 114215.13),
('BANCO ARBI S/A', 2011, 8407843.72, 81746.25)

SELECT [COLUNA], [VALOR]
FROM (
	SELECT 
		[BANCO],
		[ANO] = CAST([ANO] AS VARCHAR(100)),
		[INVESTIMENTOS] = CAST([INVESTIMENTOS] AS VARCHAR(100)),
		[DESPESAS] = CAST([DESPESAS] AS VARCHAR(100))
	FROM @CONTAS
) C
UNPIVOT (
	[VALOR] FOR [COLUNA] IN (	
		[INVESTIMENTOS], 
		[DESPESAS], 
		[BANCO],
		[ANO]
	)
) AS U</pre>
<p><img title="Transformando colunas em linhas com UNPIVOT" alt="Transformando colunas em linhas com UNPIVOT" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/073013_0122_transforman4.png?w=645" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/08/15/transformando-colunas-em-linhas-com-unpivot/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4319</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/073013_0122_transforman1.png">
			<media:title type="html">Transformando colunas em linhas com UNPIVOT</media:title>
		</media:content>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/073013_0122_transforman2.png">
			<media:title type="html">Transformando colunas em linhas com UNPIVOT</media:title>
		</media:content>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/073013_0122_transforman3.png">
			<media:title type="html">Transformando colunas em linhas com UNPIVOT</media:title>
		</media:content>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/073013_0122_transforman4.png">
			<media:title type="html">Transformando colunas em linhas com UNPIVOT</media:title>
		</media:content>
	</item>
		<item>
		<title>Como atribuir a uma variável no SQL Server, o valor de uma consulta FOR XML</title>
		<link>https://sqlfromhell.wordpress.com/2013/08/08/como-atribuir-a-uma-variavel-no-sql-server-o-valor-de-uma-consulta-for-xml/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/08/08/como-atribuir-a-uma-variavel-no-sql-server-o-valor-de-uma-consulta-for-xml/#comments</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Thu, 08 Aug 2013 23:54:50 +0000</pubDate>
				<category><![CDATA[Trabalhando com XML]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4355</guid>

					<description><![CDATA[Boa noite pessoas, Como apareceu uma questão nos artigos de FOR XML, sobre como atribuir uma consulta resultante de um FOR XML como valor de uma variável no SQL Server, elaborei estes dois exemplos. O primeiro: uma variável do tipo XML (@X), o segundo: uma variável do tipo VARCHAR (@C). Este exemplo é útil para [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Boa noite pessoas,</p>
<p>Como apareceu uma questão nos artigos de FOR XML, sobre como atribuir uma consulta resultante de um FOR XML como valor de uma variável no SQL Server, elaborei estes dois exemplos.</p>
<p>O primeiro: uma variável do tipo XML (@X), o segundo: uma variável do tipo VARCHAR (@C).</p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080813_2354_comoatribui1.png?w=645" /></p>
<p>Este exemplo é útil para vincular os artigos de <a title="Arte do FOR XML – Resumo" href="https://sqlfromhell.wordpress.com/2012/04/20/arte-do-for-xml-resumo/">FOR XML</a> com os artigos de <a title="Iniciando com XQuery – Resumo" href="https://sqlfromhell.wordpress.com/2012/04/20/iniciando-com-xquery-resumo/">XQUERY</a>, já que eu não tinha utilizado nos artigos de XQUERY nenhum exemplo cujo o valor da variável era gerado por FOR XML.</p>
<p>Espero que tenham gostado!</p>
<p><b>Artigos relacionados</b></p>
<p><strong><a title="Arte do FOR XML – Resumo" href="https://sqlfromhell.wordpress.com/2012/04/20/arte-do-for-xml-resumo/">Arte do FOR XML – Resumo</a></strong></p>
<p><a title="Link permanente para Gerando XML no SQL Server – Arte do FOR XML AUTO" href="https://sqlfromhell.wordpress.com/2011/06/22/gerando-xml-no-sql-server-arte-do-for-xml-auto/">Gerando XML no SQL Server – Arte do FOR XML AUTO</a></p>
<p><a title="Link permanente para Gerando XML no SQL Server – Arte do FOR XML EXPLICIT" href="https://sqlfromhell.wordpress.com/2011/06/30/gerando-xml-no-sql-server-arte-do-for-xml-explicit/">Gerando XML no SQL Server – Arte do FOR XML EXPLICIT</a></p>
<p><a title="Link permanente para Gerando XML no SQL Server – Arte do FOR XML RAW" href="https://sqlfromhell.wordpress.com/2011/07/07/gerando-xml-no-sql-server-arte-do-for-xml-raw/">Gerando XML no SQL Server – Arte do FOR XML RAW</a></p>
<p><a title="Link permanente para Gerando XML no SQL Server – Arte do FOR XML PATH" href="https://sqlfromhell.wordpress.com/2011/07/13/gerando-xml-no-sql-server-%e2%80%93-arte-do-for-xml-path/">Gerando XML no SQL Server – Arte do FOR XML PATH</a></p>
<p><strong><a title="Iniciando com XQuery – Resumo" href="https://sqlfromhell.wordpress.com/2012/04/20/iniciando-com-xquery-resumo/">Iniciando com XQuery – Resumo</a></strong></p>
<p><a title="Link permanente para Iniciando com XQuery – Lendo XML no SQL Server" href="https://sqlfromhell.wordpress.com/2011/08/02/lendo-xml-no-sql-server-iniciando-com-xquery/">Iniciando com XQuery – Lendo XML no SQL Server</a></p>
<p><a title="Link permanente para Iniciando com XQuery – Gerando XML no SQL Server" href="https://sqlfromhell.wordpress.com/2011/08/08/gerando-xml-no-sql-server-iniciando-com-xquery/">Iniciando com XQuery – Gerando XML no SQL Server</a></p>
<p><a title="Link permanente para Iniciando com XQuery – Modificando XML no SQL Server" href="https://sqlfromhell.wordpress.com/2011/10/18/iniciando-com-xquery-modificando-xml-no-sql-server/">Iniciando com XQuery – Modificando XML no SQL Server</a></p>
<p><a title="Link permanente para Iniciando com XQuery – Namespaces têm solução!" href="https://sqlfromhell.wordpress.com/2011/11/29/iniciando-com-xquery-namespaces-tem-solucao/">Iniciando com XQuery – Namespaces têm solução!</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/08/08/como-atribuir-a-uma-variavel-no-sql-server-o-valor-de-uma-consulta-for-xml/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4355</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080813_2354_comoatribui1.png"/>
	</item>
		<item>
		<title>Como fazer uma regressão linear no Excel 2010?</title>
		<link>https://sqlfromhell.wordpress.com/2013/08/07/como-fazer-uma-regressao-linear-no-excel-2010/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/08/07/como-fazer-uma-regressao-linear-no-excel-2010/#comments</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Wed, 07 Aug 2013 22:41:01 +0000</pubDate>
				<category><![CDATA[Estatística]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Excel 2010]]></category>
		<category><![CDATA[FORECAST]]></category>
		<category><![CDATA[PEARSON]]></category>
		<category><![CDATA[TREND]]></category>
		<category><![CDATA[TRENDLINE]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4338</guid>

					<description><![CDATA[E ai pessoas! Por estes dias, tive que fazer uma regressão linear, só que eu estava com um computador sem SPSS, PSPP ou qualquer outra ferramenta estatística, ou seja, só estava com o Excel 2010. Dai lembrei que em uma aula de métodos quantitativos no mestrado, na qual o professor mostrou que havia um add-in [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>E ai pessoas!</p>
<p>Por estes dias, tive que fazer uma regressão linear, só que eu estava com um computador sem SPSS, PSPP ou qualquer outra ferramenta estatística, ou seja, só estava com o Excel 2010.</p>
<p>Dai lembrei que em uma aula de métodos quantitativos no mestrado, na qual o professor mostrou que havia um add-in no Excel de ferramentas de análises de dados; assim fui verificar se tinha algum método de regressão nestas ferramentas, para a minha felicidade, havia.</p>
<p><em>Primeiramente, desculpem o Excel em inglês, pois eu fico totalmente perdido com a versão de pt-BR.</em></p>
<p>Nas opções do Excel,</p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum1.png?w=645" /></p>
<p>Menu Add-Ins, Manage [Excel Add-ins], Go&#8230;,</p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum2.png?w=645" /></p>
<p>Selecione o Analysis ToolPak,</p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum3.png?w=645" /></p>
<p>Crie ou obtenha alguns dados,</p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum4.png?w=645" /></p>
<p>Vá ao menu Data, Analysis, Data Analysis,</p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum5.png?w=645" /></p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum6.png?w=645" /></p>
<p>Regression,</p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum7.png?w=645" /></p>
<p>Informe o intervalo da variável dependente (Y) e da variável independente (X). Em &#8216;Output Range&#8217;, informe a célula onde o resultado da análise irá aparecer,</p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum8.png?w=645" /></p>
<p>Feito isso, teremos a análise dos dados,</p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum9.png?w=645" /></p>
<p>Para quem só precisa verificar a tendência de X para Y ou apresentar ter uma previsão, existem diversas as funções do Excel que são muito boas para isso:</p>
<p>Função <strong>PEARSON </strong>(intervalo de Y, intervalo de X) para calcular a correlação entre Y e X.</p>
<p>Função <strong>TREND </strong>(intervalo de Y, intervalo de X, valor de X) para prever o valor de Y.</p>
<p>Função <strong>FORECAST </strong>(valor de X, intervalo de Y, intervalo de X) para prever o valor de Y.</p>
<p>Para quem quer fazer uma trendline para algum gráfico, este tutorial pode ajudar bastante:</p>
<p><a href="http://www.officetooltips.com/excel/tips/adding_a_trend_line.html" target="_blank">http://www.officetooltips.com/excel/tips/adding_a_trend_line.html</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/08/07/como-fazer-uma-regressao-linear-no-excel-2010/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4338</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum1.png"/>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum2.png"/>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum3.png"/>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum4.png"/>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum5.png"/>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum6.png"/>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum7.png"/>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum8.png"/>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/08/080713_2243_comofazerum9.png"/>
	</item>
		<item>
		<title>Meu novo trabalho como DBA no IBPT</title>
		<link>https://sqlfromhell.wordpress.com/2013/08/02/meu-novo-trabalho-como-dba-no-ibpt/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/08/02/meu-novo-trabalho-como-dba-no-ibpt/#respond</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Fri, 02 Aug 2013 17:46:32 +0000</pubDate>
				<category><![CDATA[Sem Categoria]]></category>
		<category><![CDATA[Administrador de Banco de Dados]]></category>
		<category><![CDATA[Data Mining]]></category>
		<category><![CDATA[Data Warehouse]]></category>
		<category><![CDATA[DBA]]></category>
		<category><![CDATA[EuroIT]]></category>
		<category><![CDATA[IBPT]]></category>
		<category><![CDATA[Instituto Brasileiro de Planejamento Tributário]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4322</guid>

					<description><![CDATA[E ai pessoas! Na semana passada, eu comecei a trabalhar como Administrador de Banco de Dados no IBPT (Instituto Brasileiro de Planejamento Tributário). Esta será uma ótima oportunidade para eu voltar a trabalhar diretamente com SQL Server, e rever o que ao longo destes cinco anos aprendi sobre Data Mining e Data Warehouse. Isso não [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>E ai pessoas!</p>
<p>Na semana passada, eu comecei a trabalhar como Administrador de Banco de Dados no IBPT (<a title="IBPT - Instituto Brasileiro de Planejamento Tributário" href="http://www.ibpt.org.br/" target="_blank">Instituto Brasileiro de Planejamento Tributário</a>). Esta será uma ótima oportunidade para eu voltar a trabalhar diretamente com SQL Server, e rever o que ao longo destes cinco anos aprendi sobre Data Mining e Data Warehouse.</p>
<p>Isso não quer dizer que eu saí da <a title="EuroIT Tecnologia" href="http://www.euroit.com.br" target="_blank">EuroIT Tecnologia</a>, mas vou manter esta atuação nas duas empresas em períodos diferentes, principalmente pelo aprendizado que me é permitido por estas empresas, que possuem cenários bem distintos, além das atuações que desenvolvo em paralelo, como blogger, consultor de TI, professor e aluno do Mestrado em Administração da <a title="Pontifícia Universidade Católica do Paraná - PUCPR" href="http://www.pucpr.br" target="_blank">PUCPR</a>.</p>
<p>A partir de agora, também vou informar no blog os lançamentos dos projetos que tenho participado na EuroIT e no IBPT, com a expectativa de receber feedbacks de vocês que leem o blog, além de fazer conhecida minha atuação nestes projetos e as pessoas trabalham comigo, assim como fazer conhecidos os projetos propriamente ditos.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/08/02/meu-novo-trabalho-como-dba-no-ibpt/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4322</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	</item>
		<item>
		<title>Transformando linhas em colunas sem PIVOT</title>
		<link>https://sqlfromhell.wordpress.com/2013/08/01/transformando-linhas-em-colunas-sem-pivot/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/08/01/transformando-linhas-em-colunas-sem-pivot/#comments</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Thu, 01 Aug 2013 17:45:18 +0000</pubDate>
				<category><![CDATA[Introdução]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[PIVOT]]></category>
		<category><![CDATA[Pivot Table]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2012]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4311</guid>

					<description><![CDATA[Olá pessoas, Na semana passada, nós vimos como transformar linhas em colunas no SQL Server com PIVOT. Mas como nem sempre dá para contar com este recurso, e algumas vezes, ele não supre 100% das nossas necessidades, vou apresentar alguns exemplos de como fazer PIVOT sem utilizar PIVOT. Para estes exemplos, estarei utilizando da mesma [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Olá pessoas,</p>
<p>Na semana passada, nós vimos como transformar linhas em colunas no SQL Server com PIVOT. Mas como nem sempre dá para contar com este recurso, e algumas vezes, ele não supre 100% das nossas necessidades, vou apresentar alguns exemplos de como fazer PIVOT sem utilizar PIVOT.</p>
<p>Para estes exemplos, estarei utilizando da mesma massa de dados da semana anterior:</p>
<pre class="brush: sql; title: ; notranslate">DECLARE @CONTAS TABLE (
	ANO SMALLINT, 
	BANCO VARCHAR(100), 
	TIPO VARCHAR(100), 
	VALOR MONEY
)

INSERT INTO @CONTAS VALUES
(2009,'BANCO ALVORADA S/A','INVESTIMENTOS',6175979775.42),
(2010,'BANCO ALVORADA S/A','INVESTIMENTOS',6486892688.53),
(2011,'BANCO ALVORADA S/A','INVESTIMENTOS',7905663406.86),
(2012,'BANCO ALVORADA S/A','INVESTIMENTOS',9613906084.01),
(2009,'BANCO ARBI S/A','INVESTIMENTOS',8102644.84),
(2009,'BANCO ARBI S/A','OUTROS',174343.35),
(2010,'BANCO ARBI S/A','INVESTIMENTOS',7935411.15),
(2010,'BANCO ARBI S/A','OUTROS',119885.82),
(2011,'BANCO ARBI S/A','INVESTIMENTOS',8202652.29),
(2011,'BANCO ARBI S/A','OUTROS',114215.13),
(2012,'BANCO ARBI S/A','INVESTIMENTOS',8407843.72),
(2012,'BANCO ARBI S/A','OUTROS',81746.25)</pre>
<p>Conforme o primeiro exemplo da semana anterior, transformamos os registros de contas do tipo INVESTIMENTOS e OUTROS em duas colunas, utilizando PIVOT:</p>
<pre class="brush: sql; title: ; notranslate">SELECT U.ANO, U.BANCO, U.INVESTIMENTOS, U.OUTROS
FROM @CONTAS AS C
PIVOT (
	SUM(C.VALOR) FOR
	C.TIPO IN (INVESTIMENTOS, OUTROS)  
) AS U</pre>
<p>Sem PIVOT, é possível fazer o mesmo procedimento com CASE WHEN:</p>
<pre class="brush: sql; title: ; notranslate">SELECT C.ANO, C.BANCO, 
	INVESTIMENTOS = SUM(CASE WHEN C.TIPO = 'INVESTIMENTOS' THEN C.VALOR END),
	OUTROS = SUM(CASE WHEN C.TIPO = 'OUTROS' THEN C.VALOR END)
FROM @CONTAS AS C
GROUP BY C.ANO, C.BANCO</pre>
<p>E no SQL Server 2012+, com IIF:</p>
<pre class="brush: sql; title: ; notranslate">SELECT C.ANO, C.BANCO, 
	INVESTIMENTOS = SUM(IIF(C.TIPO = 'INVESTIMENTOS', C.VALOR, NULL)),
	OUTROS = SUM(IIF(C.TIPO = 'OUTROS', C.VALOR, NULL))
FROM @CONTAS AS C
GROUP BY C.ANO, C.BANCO</pre>
<p>Também é possível fazer com subqueries, mas como não é performático, então ignoraremos esta alternativa.</p>
<p>O segundo exemplo, transformamos os registros de anos em colunas respectivas a estes anos, utilizando PIVOT:</p>
<pre class="brush: sql; title: ; notranslate">SELECT U.BANCO, U.TIPO, U.[2009], U.[2010], U.[2011], U.[2012]
FROM @CONTAS AS C
PIVOT (
	SUM(C.VALOR) FOR
	C.ANO IN ([2009], [2010], [2011], [2012])  
) AS U</pre>
<p>Sem PIVOT, é possível fazer o mesmo procedimento com CASE WHEN:</p>
<pre class="brush: sql; title: ; notranslate">SELECT C.BANCO, C.TIPO,
	[2009] = SUM(CASE WHEN C.ANO = 2009 THEN C.VALOR END),
	[2010] = SUM(CASE WHEN C.ANO = 2010 THEN C.VALOR END),
	[2011] = SUM(CASE WHEN C.ANO = 2011 THEN C.VALOR END),
	[2012] = SUM(CASE WHEN C.ANO = 2012 THEN C.VALOR END)
FROM @CONTAS AS C
GROUP BY C.BANCO, C.TIPO</pre>
<p>E no SQL Server 2012+, com IIF:</p>
<pre class="brush: sql; title: ; notranslate">SELECT C.BANCO, C.TIPO,
	[2009] = SUM(IIF(C.ANO = 2009, C.VALOR, NULL)),
	[2010] = SUM(IIF(C.ANO = 2010, C.VALOR, NULL)),
	[2011] = SUM(IIF(C.ANO = 2011, C.VALOR, NULL)),
	[2012] = SUM(IIF(C.ANO = 2012, C.VALOR, NULL))
FROM @CONTAS AS C
GROUP BY C.BANCO, C.TIPO</pre>
<p>E agora, algumas questões que são mais fáceis de resolver com CASE WHEN e IIF, como criar regras mais específicas para as colunas utilizando outras funções e outras regras de agrupamento:</p>
<pre class="brush: sql; title: ; notranslate">SELECT U.BANCO, U.TIPO,
	U.[2008], U.[2009], U.[2010], U.[2011], U.[2012], 
	[2009_2010] = U.[2009] + U.[2010],
	[2011_2012] = U.[2011] + U.[2012], 
	TOTAL = U.[2009] + U.[2010] + U.[2011] + U.[2012]
FROM @CONTAS AS C
PIVOT (
	SUM(C.VALOR) FOR
	C.ANO IN ([2008], [2009], [2010], [2011], [2012])  
) AS U

SELECT C.BANCO, C.TIPO,
	[2008] = SUM(CASE WHEN C.ANO = 2008 THEN C.VALOR ELSE 0 END),
	[2009] = SUM(CASE WHEN C.ANO = 2009 THEN C.VALOR ELSE 0 END),
	[2010] = SUM(CASE WHEN C.ANO = 2010 THEN C.VALOR ELSE 0 END),
	[2011] = SUM(CASE WHEN C.ANO = 2011 THEN C.VALOR ELSE 0 END),
	[2012] = SUM(CASE WHEN C.ANO = 2012 THEN C.VALOR ELSE 0 END),
	[!2012] = SUM(CASE WHEN C.ANO &lt;&gt; 2012 THEN C.VALOR ELSE 0 END),
	[&lt;2012] = SUM(CASE WHEN C.ANO &lt; 2012 THEN C.VALOR ELSE 0 END),
	[2009_2010] = SUM(CASE WHEN C.ANO IN (2009, 2010) THEN C.VALOR ELSE 0 END),
	[2011_2012] = SUM(CASE WHEN C.ANO BETWEEN 2011 AND 2012 THEN C.VALOR ELSE 0 END),
	TOTAL = SUM(C.VALOR),
	MEDIA = AVG(C.VALOR)
FROM @CONTAS AS C
GROUP BY C.BANCO, C.TIPO

SELECT C.BANCO, C.TIPO,
	[2008] = SUM(IIF(C.ANO = 2008, C.VALOR, 0)),
	[2009] = SUM(IIF(C.ANO = 2009, C.VALOR, 0)),
	[2010] = SUM(IIF(C.ANO = 2010, C.VALOR, 0)),
	[2011] = SUM(IIF(C.ANO = 2011, C.VALOR, 0)),
	[2012] = SUM(IIF(C.ANO = 2012, C.VALOR, 0)),
	[!2012] = SUM(IIF(C.ANO &lt;&gt; 2012, C.VALOR, 0)),
	[&lt;2012] = SUM(IIF(C.ANO &lt; 2012, C.VALOR, 0)),
	[2009_2010] = SUM(IIF(C.ANO IN (2009, 2010), C.VALOR, 0)),
	[2011_2012] = SUM(IIF(C.ANO BETWEEN 2011 AND 2012, C.VALOR, 0)),
	TOTAL = SUM(C.VALOR),
	MEDIA = AVG(C.VALOR)
FROM @CONTAS AS C
GROUP BY C.BANCO, C.TIPO</pre>
<p>E a composição de um agrupamento de linhas para colunas com considerando mais de uma coluna:</p>
<pre class="brush: sql; title: ; notranslate">SELECT BANCO = COALESCE(U_I.BANCO, U_O.BANCO), 
	INV_2009 = U_I.[2009], 
	INV_2010 = U_I.[2010], 
	INV_2011 = U_I.[2011], 
	INV_2012 = U_I.[2012], 
	OUT_2009 = U_O.[2009], 
	OUT_2010 = U_O.[2010], 
	OUT_2011 = U_O.[2011], 
	OUT_2012 = U_O.[2012]
FROM 
(SELECT BANCO, ANO, VALOR FROM @CONTAS WHERE TIPO = 'INVESTIMENTOS') AS C_I
PIVOT (
	SUM(C_I.VALOR) FOR
	C_I.ANO IN ([2009], [2010], [2011], [2012])  
) AS U_I
FULL OUTER JOIN
(SELECT BANCO, ANO, VALOR FROM @CONTAS WHERE TIPO = 'OUTROS') AS C_O
PIVOT (
	SUM(C_O.VALOR) FOR
	C_O.ANO IN ([2009], [2010], [2011], [2012])  
) AS U_O
ON U_I.BANCO = U_O.BANCO
</pre>
<pre class="brush: sql; title: ; notranslate">
SELECT C.BANCO,
	INV_2009 = SUM(CASE WHEN C.ANO = 2009 AND TIPO = 'INVESTIMENTOS' THEN C.VALOR ELSE 0 END),
	INV_2010 = SUM(CASE WHEN C.ANO = 2010 AND TIPO = 'INVESTIMENTOS' THEN C.VALOR ELSE 0 END),
	INV_2011 = SUM(CASE WHEN C.ANO = 2011 AND TIPO = 'INVESTIMENTOS' THEN C.VALOR ELSE 0 END),
	INV_2012 = SUM(CASE WHEN C.ANO = 2012 AND TIPO = 'INVESTIMENTOS' THEN C.VALOR ELSE 0 END), 
	OUT_2009 = SUM(CASE WHEN C.ANO = 2009 AND TIPO = 'OUTROS' THEN C.VALOR ELSE 0 END), 
	OUT_2010 = SUM(CASE WHEN C.ANO = 2010 AND TIPO = 'OUTROS' THEN C.VALOR ELSE 0 END), 
	OUT_2011 = SUM(CASE WHEN C.ANO = 2011 AND TIPO = 'OUTROS' THEN C.VALOR ELSE 0 END), 
	OUT_2012 = SUM(CASE WHEN C.ANO = 2012 AND TIPO = 'OUTROS' THEN C.VALOR ELSE 0 END)
FROM @CONTAS AS C
GROUP BY C.BANCO
</pre>
<pre class="brush: sql; title: ; notranslate">
SELECT C.BANCO,
	INV_2009 = SUM(IIF(C.ANO = 2009 AND TIPO = 'INVESTIMENTOS', C.VALOR, 0)),
	INV_2010 = SUM(IIF(C.ANO = 2010 AND TIPO = 'INVESTIMENTOS', C.VALOR, 0)),
	INV_2011 = SUM(IIF(C.ANO = 2011 AND TIPO = 'INVESTIMENTOS', C.VALOR, 0)),
	INV_2012 = SUM(IIF(C.ANO = 2012 AND TIPO = 'INVESTIMENTOS', C.VALOR, 0)), 
	OUT_2009 = SUM(IIF(C.ANO = 2009 AND TIPO = 'OUTROS', C.VALOR, 0)), 
	OUT_2010 = SUM(IIF(C.ANO = 2010 AND TIPO = 'OUTROS', C.VALOR, 0)), 
	OUT_2011 = SUM(IIF(C.ANO = 2011 AND TIPO = 'OUTROS', C.VALOR, 0)), 
	OUT_2012 = SUM(IIF(C.ANO = 2012 AND TIPO = 'OUTROS', C.VALOR, 0))
FROM @CONTAS AS C
GROUP BY C.BANCO</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/08/01/transformando-linhas-em-colunas-sem-pivot/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4311</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	</item>
		<item>
		<title>Transformando linhas em colunas com PIVOT</title>
		<link>https://sqlfromhell.wordpress.com/2013/07/18/transformando-linhas-em-colunas-com-pivot/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/07/18/transformando-linhas-em-colunas-com-pivot/#comments</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Thu, 18 Jul 2013 19:40:18 +0000</pubDate>
				<category><![CDATA[Introdução]]></category>
		<category><![CDATA[Virtual PASS BR]]></category>
		<category><![CDATA[PIVOT]]></category>
		<category><![CDATA[Pivot Table]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4293</guid>

					<description><![CDATA[Olá pessoas, A mágica de transformar linhas em colunas no SQL Server com PIVOT não é tão simples, o que requer um pouco de domínio de T-SQL, para saber como utiliza-la, além de não ser pego por alguns erros comuns. Neste primeiro artigo, vou apresentar alguns exemplos simples, e apresentar um problema comum de se [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Olá pessoas,</p>
<p>A mágica de transformar linhas em colunas no SQL Server com PIVOT não é tão simples, o que requer um pouco de domínio de T-SQL, para saber como utiliza-la, além de não ser pego por alguns erros comuns.</p>
<p>Neste primeiro artigo, vou apresentar alguns exemplos simples, e apresentar um problema comum de se trabalhar com PIVOT.</p>
<p>De início, temos uma massa de dados:</p>
<pre class="brush: sql; title: ; notranslate">
DECLARE @CONTAS TABLE (
  ANO SMALLINT,
  BANCO VARCHAR(100),
  TIPO VARCHAR(100),
  VALOR MONEY
)

INSERT INTO @CONTAS VALUES
(2009,'BANCO ALVORADA S/A','INVESTIMENTOS',6175979775.42),
(2010,'BANCO ALVORADA S/A','INVESTIMENTOS',6486892688.53),
(2011,'BANCO ALVORADA S/A','INVESTIMENTOS',7905663406.86),
(2012,'BANCO ALVORADA S/A','INVESTIMENTOS',9613906084.01),
(2009,'BANCO ARBI S/A','INVESTIMENTOS',8102644.84),
(2009,'BANCO ARBI S/A','OUTROS',174343.35),
(2010,'BANCO ARBI S/A','INVESTIMENTOS',7935411.15),
(2010,'BANCO ARBI S/A','OUTROS',119885.82),
(2011,'BANCO ARBI S/A','INVESTIMENTOS',8202652.29),
(2011,'BANCO ARBI S/A','OUTROS',114215.13),
(2012,'BANCO ARBI S/A','INVESTIMENTOS',8407843.72),
(2012,'BANCO ARBI S/A','OUTROS',81746.25)

SELECT ANO, BANCO, TIPO, VALOR FROM @CONTAS
</pre>
<p>Para criar transformar as linhas de contas do tipo &#8216;INVESTIMENTOS&#8217; e &#8216;OUTROS&#8217; em linhas com uma coluna com os valores respectivos a &#8216;INVESTIMENTOS&#8217; e outra a &#8216;OUTROS&#8217;, utilizaremos a expressão PIVOT sobre a tabela @CONTAS, somando os valores da coluna &#8216;VALOR&#8217; para onde a coluna &#8216;TIPO&#8217; apresenta os valores &#8216;INVESTIMENTOS&#8217; e &#8216;OUTROS&#8217;, assim temos a primeira consulta e resultado:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT U.ANO, U.BANCO, U.INVESTIMENTOS, U.OUTROS
FROM @CONTAS AS C
PIVOT (
  SUM(VALOR) FOR
  TIPO IN (INVESTIMENTOS, OUTROS)
) AS U
</pre>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/071613_2110_transforman1.png?w=645" /></p>
<p>Desta forma, os registros da tabela @CONTAS se transformam na PIVOT com o alias/apelido U (pode ser outra alias, sem problemas), assim as colunas TIPO e VALOR deixaram de existir, e são agrupadas por ANO e BANCO nas colunas INVESTIMENTOS e OUTROS.</p>
<p><em>Obs.: Não é obrigatório especificar as colunas no SELECT, pois ele só reconhecerá as colunas do alias U, mas especifiquem para ficar organizado.</em></p>
<p>Abaixo, um exemplo utilizando a coluna VALOR agrupada por BANCO e TIPO para cada um dos anos da coluna ANO:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT U.BANCO, U.TIPO, U.[2009], U.[2010], U.[2011], U.[2012]
FROM @CONTAS AS C
PIVOT (
  SUM(C.VALOR) FOR
  C.ANO IN ([2009], [2010], [2011], [2012])
) AS U
</pre>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/071613_2110_transforman2.png?w=645" /></p>
<p>Uma preocupação que se deve ter ao utilizar PIVOT é especificar claramente as colunas que serão agrupadas e quais as colunas que não serão, pois o SQL Server ainda não lê pensamentos, o que gera um erro bem comum, como apresentado abaixo.</p>
<p><span style="color:#ff6600;"><em>&#8220;Então, estou com aquele script de PIVOT </em>(A)<em>, mas quando removi a coluna ANO, para agrupar pelas colunas BANCO, INVESTIMENTOS e OUTROS, mas não deu certo, começou a aparecer duplicado a coluna BANCO </em>(B)</span><em><span style="color:#ff6600;">.&#8221;</span><br />
</em></p>
<p><strong>(A):</strong></p>
<pre class="brush: sql; title: ; notranslate">
SELECT U.BANCO, U.INVESTIMENTOS, U.OUTROS
FROM @CONTAS AS C
PIVOT (
  SUM(VALOR) FOR
  TIPO IN (INVESTIMENTOS, OUTROS)
) AS U
</pre>
<p><strong>(B):</strong></p>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/071613_2110_transforman3.png?w=645" /></p>
<p>Este problema se dá ao fato, que independente de você tirar as colunas especificadas no SELECT, a PIVOT continuará sendo feita sobre todas as colunas da tabela, ou seja, tirou a coluna &#8216;ANO&#8217; do SELECT, não quer dizer que a PIVOT vai esquecer que a coluna &#8216;ANO&#8217; existe.</p>
<p>Para evitar este problema, ao invés de utilizar diretamente a tabela para a PIVOT, especifique em uma subconsulta, quais colunas a PIVOT utilizará, exemplo:</p>
<pre class="brush: sql; title: ; notranslate">
SELECT U.BANCO, U.INVESTIMENTOS, U.OUTROS
FROM (
  SELECT BANCO, TIPO, VALOR
  FROM @CONTAS
) AS C
PIVOT (
  SUM(C.VALOR) FOR
  C.TIPO IN (INVESTIMENTOS, OUTROS)
) AS U
</pre>
<p><img alt="" src="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/071613_2110_transforman4.png?w=645" /></p>
<p>Próximas semanas, eu vou apresentar o UNPIVOT e também ensinar as limitações destas cláusulas e mágicas, assim como explicar como fazer as mesmas coisas sem utilizar PIVOT e UNPIVOT.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/07/18/transformando-linhas-em-colunas-com-pivot/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4293</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/071613_2110_transforman1.png"/>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/071613_2110_transforman2.png"/>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/071613_2110_transforman3.png"/>

		<media:content medium="image" url="https://sqlfromhell.wordpress.com/wp-content/uploads/2013/07/071613_2110_transforman4.png"/>
	</item>
		<item>
		<title>Auxílio na coleta de dados</title>
		<link>https://sqlfromhell.wordpress.com/2013/07/10/auxilio-na-coleta-de-dados/</link>
					<comments>https://sqlfromhell.wordpress.com/2013/07/10/auxilio-na-coleta-de-dados/#comments</comments>
		
		<dc:creator><![CDATA[Paulo R. Pereira]]></dc:creator>
		<pubDate>Thu, 11 Jul 2013 01:48:51 +0000</pubDate>
				<category><![CDATA[Sem Categoria]]></category>
		<category><![CDATA[conhecimento]]></category>
		<category><![CDATA[inovação]]></category>
		<category><![CDATA[relacionamentos]]></category>
		<guid isPermaLink="false">http://sqlfromhell.wordpress.com/?p=4287</guid>

					<description><![CDATA[Olá pessoas, Eu estou na fase de coleta de dados da minha dissertação na PUCPR, que trata das dimensões do capital social (caracterizadas pelos relacionamentos interpessoais), compartilhamento de conhecimento e inovação. Quem puder responder o questionário disponível no link abaixo e/ou compartilhar este link entre seus contatos (pelo Facebook, LinkedIn, e-mail&#8230;), desde já agradeço. https://pucpr.us2.qualtrics.com/SE/?SID=SV_cGZUUBFBOZwV1TD Caso alguém também queira [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Olá pessoas,</p>
<p>Eu estou na fase de coleta de dados da minha dissertação na PUCPR, que trata das dimensões do capital social (caracterizadas pelos <strong>relacionamentos interpessoais</strong>), <strong>compartilhamento de conhecimento</strong> e <strong>inovação</strong>.</p>
<p>Quem puder responder o questionário disponível no link abaixo e/ou compartilhar este link entre seus contatos (pelo Facebook, LinkedIn, e-mail&#8230;), desde já agradeço.</p>
<p><a href="https://pucpr.us2.qualtrics.com/SE/?SID=SV_cGZUUBFBOZwV1TD">https://pucpr.us2.qualtrics.com/SE/?SID=SV_cGZUUBFBOZwV1TD</a></p>
<p>Caso alguém também queira assistir a defesa da dissertação e/ou ser informado sobre os resultados obtidos pela pesquisa, ao final do questionário tem um campo para informar seu e-mail de contato.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlfromhell.wordpress.com/2013/07/10/auxilio-na-coleta-de-dados/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4287</post-id>
		<media:content medium="image" url="https://1.gravatar.com/avatar/195a3f317c8a3573c84c75b715ab9acf3285fc8e8a2a084c9ef559aecc943e1b?s=96&amp;d=identicon&amp;r=G">
			<media:title type="html">Paulo R. Pereira</media:title>
		</media:content>
	</item>
	</channel>
</rss>