http://pacman.com/
Pacman - Site Oficial
domingo, 30 de maio de 2010
quarta-feira, 26 de maio de 2010
RM/RMChronus - Gera Batidas a Efetuar
Script que simula a geração dos horários do funcionários quem deverão ser efetuados de acordo com o Histórico de Horários e Índices.
CREATE TABLE ZBATIDASREALIZAR (
CODCOLIGADA SMALLINT,
CHAPA VARCHAR(16),
DATA DATETIME,
CODHORARIO VARCHAR(10),
INDICE INT,
BATIDA INT,
TIPO INT,
NATUREZA INT,
CONSTRAINT PKZBATIDASREALIZAR PRIMARY KEY (CODCOLIGADA, CHAPA, DATA, CODHORARIO, INDICE, BATIDA, TIPO, NATUREZA))
GO
CREATE PROCEDURE SP_GERABATIDASEFETUAR @CODCOLIGADA SMALLINT, @CHAPA VARCHAR(16)
AS
BEGIN
DECLARE --@CODCOLIGADA SMALLINT,
--@CHAPA VARCHAR(16),
@DTMUDANCA DATETIME,
@CODHORARIO VARCHAR(10),
@INDINICIOHOR INT,
@INDICEMAXIMO INT,
@DATABASEHOR DATETIME,
@DTMUDANCAANT DATETIME,
@CODHORARIOANT VARCHAR(10),
@INDINICIOHORANT INT,
@INDICEMAXIMOANT INT,
@DATABASEHORANT DATETIME,
@INICIOPERMES DATETIME,
@FIMPERMES DATETIME,
@DATATMP DATETIME,
@INDICETMP INT,
@DATATMP2 DATETIME
DECLARE CR_HISTHOR CURSOR FOR
SELECT CODCOLIGADA,
CHAPA,
DTMUDANCA,
CODHORARIO,
INDINICIOHOR,
(SELECT MAX(DISTINCT INDICE)
FROM ABATHOR
WHERE CODCOLIGADA = PH.CODCOLIGADA
AND CODHORARIO = PH.CODHORARIO) AS MAXINDICEHOR,
(SELECT DATABASEHOR
FROM AHORARIO
WHERE CODCOLIGADA = PH.CODCOLIGADA
AND CODIGO = PH.CODHORARIO) AS DATABASEHORARIO
FROM PFHSTHOR PH
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA
OPEN CR_HISTHOR
FETCH NEXT FROM CR_HISTHOR INTO @CODCOLIGADA, @CHAPA, @DTMUDANCA, @CODHORARIO,
@INDINICIOHOR, @INDICEMAXIMO, @DATABASEHOR
SELECT @INICIOPERMES = INICIOPERMES,
@FIMPERMES = FIMPERMES
FROM APARAM
WHERE CODCOLIGADA = @CODCOLIGADA
DELETE FROM ZBATIDASREALIZAR
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @DTMUDANCAANT = @DTMUDANCA,
@CODHORARIOANT = @CODHORARIO,
@INDINICIOHORANT = @INDINICIOHOR,
@INDICEMAXIMOANT = @INDICEMAXIMO,
@DATABASEHORANT = @DATABASEHOR
FETCH NEXT FROM CR_HISTHOR INTO @CODCOLIGADA, @CHAPA, @DTMUDANCA, @CODHORARIO,
@INDINICIOHOR, @INDICEMAXIMO, @DATABASEHOR
SET @DATATMP = @DATABASEHORANT
SET @INDICETMP = @INDINICIOHORANT
IF @CODCOLIGADA IS NOT NULL
BEGIN
WHILE @DATATMP(@DTMUDANCAANT)
AND @DATATMP NOT IN (SELECT DIAFERIADO
FROM GFERIADO
WHERE CODCALENDARIO IN (SELECT CODCALENDARIO
FROM PSECAO
WHERE CODCOLIGADA = @CODCOLIGADA
AND CODIGO = (SELECT CODSECAO
FROM PFUNC
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA))))
BEGIN
INSERT INTO ZBATIDASREALIZAR (CODCOLIGADA, CHAPA, DATA, CODHORARIO, INDICE, BATIDA, TIPO, NATUREZA)
SELECT CODCOLIGADA, @CHAPA, @DATATMP, CODHORARIO, INDICE, BATIDA, TIPO, NATUREZA
FROM ABATHOR
WHERE CODCOLIGADA = @CODCOLIGADA
AND CODHORARIO = @CODHORARIOANT
AND INDICE = @INDICETMP
AND TIPO = 0
END
IF (@INDICETMP+1)>@INDICEMAXIMOANT
BEGIN
SET @INDICETMP = 1
END
ELSE
BEGIN
SET @INDICETMP = @INDICETMP+1
END
SET @DATATMP = @DATATMP+1
END
END
END
-- HISTÓRICO UNICO OU MÁXIMO HISTÓRICO
DECLARE CR_HISTHORULTIMO CURSOR FOR
SELECT CODCOLIGADA,
CHAPA,
DTMUDANCA,
CODHORARIO,
INDINICIOHOR,
(SELECT MAX(DISTINCT INDICE)
FROM ABATHOR
WHERE CODCOLIGADA = PH.CODCOLIGADA
AND CODHORARIO = PH.CODHORARIO) AS MAXINDICEHOR,
(SELECT DATABASEHOR
FROM AHORARIO
WHERE CODCOLIGADA = PH.CODCOLIGADA
AND CODIGO = PH.CODHORARIO) AS DATABASEHORARIO
FROM PFHSTHOR PH
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA
AND DTMUDANCA = (SELECT MAX(DTMUDANCA)
FROM PFHSTHOR
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA)
OPEN CR_HISTHORULTIMO
FETCH NEXT FROM CR_HISTHORULTIMO INTO @CODCOLIGADA, @CHAPA, @DTMUDANCA, @CODHORARIO,
@INDINICIOHOR, @INDICEMAXIMO, @DATABASEHOR
SET @DATATMP2 = @DATABASEHOR
SET @INDICETMP = @INDINICIOHOR
WHILE @@FETCH_STATUS = 0
BEGIN
WHILE @DATATMP2<=@FIMPERMES BEGIN IF (@DATATMP2>=(@DATATMP)
AND @DATATMP2 NOT IN (SELECT DIAFERIADO
FROM GFERIADO
WHERE CODCALENDARIO IN (SELECT CODCALENDARIO
FROM PSECAO
WHERE CODCOLIGADA = @CODCOLIGADA
AND CODIGO = (SELECT CODSECAO
FROM PFUNC
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA))))
BEGIN
INSERT INTO ZBATIDASREALIZAR (CODCOLIGADA, CHAPA, DATA, CODHORARIO, INDICE, BATIDA, TIPO, NATUREZA)
SELECT CODCOLIGADA, @CHAPA, @DATATMP2, CODHORARIO, INDICE, BATIDA, TIPO, NATUREZA
FROM ABATHOR
WHERE CODCOLIGADA = @CODCOLIGADA
AND CODHORARIO = @CODHORARIO
AND INDICE = @INDICETMP
AND TIPO = 0
END
IF (@INDICETMP+1)>@INDICEMAXIMO
BEGIN
SET @INDICETMP = 1
END
ELSE
BEGIN
SET @INDICETMP = @INDICETMP+1
END
SET @DATATMP2 = @DATATMP2+1
END
FETCH NEXT FROM CR_HISTHORULTIMO INTO @CODCOLIGADA, @CHAPA, @DTMUDANCA, @CODHORARIO,
@INDINICIOHOR, @INDICEMAXIMO, @DATABASEHOR
END
CLOSE CR_HISTHORULTIMO
DEALLOCATE CR_HISTHORULTIMO
CLOSE CR_HISTHOR
DEALLOCATE CR_HISTHOR
END
GO
/*
SP_GERABATIDASEFETUAR 15,'003029'
SELECT *
FROM ZBATIDASREALIZAR
ORDER BY DATA, BATIDA
GO
SELECT *
FROM ABATHOR
WHERE CODHORARIO = '018'
GO
*/
CREATE TABLE ZBATIDASREALIZAR (
CODCOLIGADA SMALLINT,
CHAPA VARCHAR(16),
DATA DATETIME,
CODHORARIO VARCHAR(10),
INDICE INT,
BATIDA INT,
TIPO INT,
NATUREZA INT,
CONSTRAINT PKZBATIDASREALIZAR PRIMARY KEY (CODCOLIGADA, CHAPA, DATA, CODHORARIO, INDICE, BATIDA, TIPO, NATUREZA))
GO
CREATE PROCEDURE SP_GERABATIDASEFETUAR @CODCOLIGADA SMALLINT, @CHAPA VARCHAR(16)
AS
BEGIN
DECLARE --@CODCOLIGADA SMALLINT,
--@CHAPA VARCHAR(16),
@DTMUDANCA DATETIME,
@CODHORARIO VARCHAR(10),
@INDINICIOHOR INT,
@INDICEMAXIMO INT,
@DATABASEHOR DATETIME,
@DTMUDANCAANT DATETIME,
@CODHORARIOANT VARCHAR(10),
@INDINICIOHORANT INT,
@INDICEMAXIMOANT INT,
@DATABASEHORANT DATETIME,
@INICIOPERMES DATETIME,
@FIMPERMES DATETIME,
@DATATMP DATETIME,
@INDICETMP INT,
@DATATMP2 DATETIME
DECLARE CR_HISTHOR CURSOR FOR
SELECT CODCOLIGADA,
CHAPA,
DTMUDANCA,
CODHORARIO,
INDINICIOHOR,
(SELECT MAX(DISTINCT INDICE)
FROM ABATHOR
WHERE CODCOLIGADA = PH.CODCOLIGADA
AND CODHORARIO = PH.CODHORARIO) AS MAXINDICEHOR,
(SELECT DATABASEHOR
FROM AHORARIO
WHERE CODCOLIGADA = PH.CODCOLIGADA
AND CODIGO = PH.CODHORARIO) AS DATABASEHORARIO
FROM PFHSTHOR PH
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA
OPEN CR_HISTHOR
FETCH NEXT FROM CR_HISTHOR INTO @CODCOLIGADA, @CHAPA, @DTMUDANCA, @CODHORARIO,
@INDINICIOHOR, @INDICEMAXIMO, @DATABASEHOR
SELECT @INICIOPERMES = INICIOPERMES,
@FIMPERMES = FIMPERMES
FROM APARAM
WHERE CODCOLIGADA = @CODCOLIGADA
DELETE FROM ZBATIDASREALIZAR
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @DTMUDANCAANT = @DTMUDANCA,
@CODHORARIOANT = @CODHORARIO,
@INDINICIOHORANT = @INDINICIOHOR,
@INDICEMAXIMOANT = @INDICEMAXIMO,
@DATABASEHORANT = @DATABASEHOR
FETCH NEXT FROM CR_HISTHOR INTO @CODCOLIGADA, @CHAPA, @DTMUDANCA, @CODHORARIO,
@INDINICIOHOR, @INDICEMAXIMO, @DATABASEHOR
SET @DATATMP = @DATABASEHORANT
SET @INDICETMP = @INDINICIOHORANT
IF @CODCOLIGADA IS NOT NULL
BEGIN
WHILE @DATATMP
AND @DATATMP NOT IN (SELECT DIAFERIADO
FROM GFERIADO
WHERE CODCALENDARIO IN (SELECT CODCALENDARIO
FROM PSECAO
WHERE CODCOLIGADA = @CODCOLIGADA
AND CODIGO = (SELECT CODSECAO
FROM PFUNC
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA))))
BEGIN
INSERT INTO ZBATIDASREALIZAR (CODCOLIGADA, CHAPA, DATA, CODHORARIO, INDICE, BATIDA, TIPO, NATUREZA)
SELECT CODCOLIGADA, @CHAPA, @DATATMP, CODHORARIO, INDICE, BATIDA, TIPO, NATUREZA
FROM ABATHOR
WHERE CODCOLIGADA = @CODCOLIGADA
AND CODHORARIO = @CODHORARIOANT
AND INDICE = @INDICETMP
AND TIPO = 0
END
IF (@INDICETMP+1)>@INDICEMAXIMOANT
BEGIN
SET @INDICETMP = 1
END
ELSE
BEGIN
SET @INDICETMP = @INDICETMP+1
END
SET @DATATMP = @DATATMP+1
END
END
END
-- HISTÓRICO UNICO OU MÁXIMO HISTÓRICO
DECLARE CR_HISTHORULTIMO CURSOR FOR
SELECT CODCOLIGADA,
CHAPA,
DTMUDANCA,
CODHORARIO,
INDINICIOHOR,
(SELECT MAX(DISTINCT INDICE)
FROM ABATHOR
WHERE CODCOLIGADA = PH.CODCOLIGADA
AND CODHORARIO = PH.CODHORARIO) AS MAXINDICEHOR,
(SELECT DATABASEHOR
FROM AHORARIO
WHERE CODCOLIGADA = PH.CODCOLIGADA
AND CODIGO = PH.CODHORARIO) AS DATABASEHORARIO
FROM PFHSTHOR PH
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA
AND DTMUDANCA = (SELECT MAX(DTMUDANCA)
FROM PFHSTHOR
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA)
OPEN CR_HISTHORULTIMO
FETCH NEXT FROM CR_HISTHORULTIMO INTO @CODCOLIGADA, @CHAPA, @DTMUDANCA, @CODHORARIO,
@INDINICIOHOR, @INDICEMAXIMO, @DATABASEHOR
SET @DATATMP2 = @DATABASEHOR
SET @INDICETMP = @INDINICIOHOR
WHILE @@FETCH_STATUS = 0
BEGIN
WHILE @DATATMP2<=@FIMPERMES BEGIN IF (@DATATMP2>=(@DATATMP)
AND @DATATMP2 NOT IN (SELECT DIAFERIADO
FROM GFERIADO
WHERE CODCALENDARIO IN (SELECT CODCALENDARIO
FROM PSECAO
WHERE CODCOLIGADA = @CODCOLIGADA
AND CODIGO = (SELECT CODSECAO
FROM PFUNC
WHERE CODCOLIGADA = @CODCOLIGADA
AND CHAPA = @CHAPA))))
BEGIN
INSERT INTO ZBATIDASREALIZAR (CODCOLIGADA, CHAPA, DATA, CODHORARIO, INDICE, BATIDA, TIPO, NATUREZA)
SELECT CODCOLIGADA, @CHAPA, @DATATMP2, CODHORARIO, INDICE, BATIDA, TIPO, NATUREZA
FROM ABATHOR
WHERE CODCOLIGADA = @CODCOLIGADA
AND CODHORARIO = @CODHORARIO
AND INDICE = @INDICETMP
AND TIPO = 0
END
IF (@INDICETMP+1)>@INDICEMAXIMO
BEGIN
SET @INDICETMP = 1
END
ELSE
BEGIN
SET @INDICETMP = @INDICETMP+1
END
SET @DATATMP2 = @DATATMP2+1
END
FETCH NEXT FROM CR_HISTHORULTIMO INTO @CODCOLIGADA, @CHAPA, @DTMUDANCA, @CODHORARIO,
@INDINICIOHOR, @INDICEMAXIMO, @DATABASEHOR
END
CLOSE CR_HISTHORULTIMO
DEALLOCATE CR_HISTHORULTIMO
CLOSE CR_HISTHOR
DEALLOCATE CR_HISTHOR
END
GO
/*
SP_GERABATIDASEFETUAR 15,'003029'
SELECT *
FROM ZBATIDASREALIZAR
ORDER BY DATA, BATIDA
GO
SELECT *
FROM ABATHOR
WHERE CODHORARIO = '018'
GO
*/
terça-feira, 18 de maio de 2010
Celular Android - Modem
Para configurar um celular Android como modem 3g:
1) Desktop/Laptop
- Baixe e instale o software PDANET apropriado ao seu sistema operacional do seguinte link:
http://www.junefabrics.com/android/download.php
- Instale o software no seu Desktop/Laptop
- Siga as instruções do software.
2) Celular Android
- Procure e Baixe em "Market", o software PDANet.
- Após a instalação, vá em "Configurações - Aplicativos - Desenvolvimento" e marque a opção "Depuração de USB".
- Volte ao PDANet e clique em "Enable USB Tether".
- No Dekstop/Laptop, clique com o botão direito localizado na bandeja do sistema, e
selecione a opção "Connect".
Assim, você estará conectado na internet, utilizando o celular Android como modem.
1) Desktop/Laptop
- Baixe e instale o software PDANET apropriado ao seu sistema operacional do seguinte link:
http://www.junefabrics.com/android/download.php
- Instale o software no seu Desktop/Laptop
- Siga as instruções do software.
2) Celular Android
- Procure e Baixe em "Market", o software PDANet.
- Após a instalação, vá em "Configurações - Aplicativos - Desenvolvimento" e marque a opção "Depuração de USB".
- Volte ao PDANet e clique em "Enable USB Tether".
- No Dekstop/Laptop, clique com o botão direito localizado na bandeja do sistema, e
selecione a opção "Connect".
Assim, você estará conectado na internet, utilizando o celular Android como modem.
terça-feira, 11 de maio de 2010
Mandic - Twitter
MANDIC OFERECE ATENDIMENTO AO
CLIENTE ATRAVÉS DE PERFIS DO TWITTER
Para facilitar o atendimento a suas dúvidas e solicitações, a MANDIC agora oferece atendimento ao cliente através de quatro perfis do twitter: MANDIC diretoria, MANDIC vendas, MANDIC suporte e MANDIC reclame.
Dessa forma, você pode nos passar seus comentários e receber atendimento 24h pelo site de relacionamento. Siga agora o perfil de sua necessidade.
@mandicDiretoria
@mandicVendas
@mandicReclame
@mandicSuporte
CLIENTE ATRAVÉS DE PERFIS DO TWITTER
Para facilitar o atendimento a suas dúvidas e solicitações, a MANDIC agora oferece atendimento ao cliente através de quatro perfis do twitter: MANDIC diretoria, MANDIC vendas, MANDIC suporte e MANDIC reclame.
Dessa forma, você pode nos passar seus comentários e receber atendimento 24h pelo site de relacionamento. Siga agora o perfil de sua necessidade.
@mandicDiretoria
@mandicVendas
@mandicReclame
@mandicSuporte
terça-feira, 4 de maio de 2010
segunda-feira, 3 de maio de 2010
domingo, 2 de maio de 2010
RM/NFE - Nota Fiscal Eletrônica
RM/Gerador - Quebra de Linhas em Arquivo Bancário
Para quebra de linha em relatórios no formato de "arquivo bancario" utilize o seguinte texto: #$D#$A
Exemplo: "linha1" "#$D#$A" "linha2"
Resultado:
linha1
linha2
Exemplo: "linha1" "#$D#$A" "linha2"
Resultado:
linha1
linha2
SQL - Numerando as linhas do SELECT Dinamicamente
Numerando as linhas do SELECT Dinamicamente
Muitas vezes temos a necessidade de numerar dinamicamente as linhas resultantes de um SELECT statement. No SQL Server 2005 podemos fazer isso facilmente utilizando a função ROW_NUMBER(), já no SQL Server 2000 as soluções são normalmente baseadas em loops e tabelas temporárias. Veja a dica desta semana e saiba como fazer isso utilizando JOIN.
No SQL Server 2000, sempre que precisamos numerar os registros resultantes de um SELECT de forma dinâmica, as sugestôes normalmente são baseadas em loops e tabelas temporárias. Para a nossa felicidade, o SQL Server 2005 vem com uma função chamada ROW_NUMBER() a qual nos permite realizar esta operação de forma bem mais simples. No exemplo abaixo, podemos ver como esta função pode ser utilizada.
USE AdventureWorks
GO
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number',
c.FirstName, c.LastName,a.PostalCode
FROM Sales.SalesPerson s
JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0
Row Number FirstName LastName PostalCode
---------- ----------- ----------- ----------
1 Shelley Dyck 98027
2 Gail Erickson 98055
3 Maciej Dusza 98027
4 Linda Ecoffey 98027
5 Mark Erickson 98055
6 Terry Eminhizer 98055
7 Michael Emanuel 98055
8 Jauna Elson 98055
9 Carol Elliott 98027
10 Janeth Esteves 98055
11 Martha Espinoza 98055
12 Carla Eldridge 98027
13 Twanna Evans 98055
A dica desta semana mostra como podemos obter este resultado no SQL Server 2000 sem precisar usar loops ou tabelas temporárias. A técnica é baseada em JOINS, o qual inclusive tende a ser bem mais performática que as soluções tradicionais.
No primeiro exemplo, utilizamos um INNER JOIN da tabela pubs..authors com ela mesma e contamos o número de vezes que o relacionamento "é maior igual que" é satisfeito, agrupando por lastname e firstname.
SELECT rank=count(*), a1.au_lname, a1.au_fname
FROM authors a1 INNER JOIN authors a2
ON a1.au_lname >= a2.au_lname
GROUP BY a1.au_lname, a1.au_fname
ORDER BY 1
rank au_lname au_fname
----------- ---------------- ---------
1 Bennet Abraham
2 Blotchet-Halls Reginald
3 Carson Cheryl
4 DeFrance Michel
5 del Castillo Innes
6 Dull Ann
7 Green Marjorie
(23 row(s) affected)
No segundo exemplo, utilizamos tabelas derivadas para obter as lojas com seus respectivos números de livros vendidos. O relacionamento é baseados no número de livros vendidos "é maior igual que".
SELECT rank=count(*), s1.stor_id, qty=sum(s1.qty)
FROM (SELECT stor_id, qty=sum(qty) FROM sales GROUP BY stor_id) s1,
(SELECT stor_id, qty=sum(qty) FROM sales GROUP BY stor_id) s2
WHERE s1.qty >= s2.qty
GROUP BY s1.stor_id
ORDER BY 1
rank stor_id qty
------- ------- ----
1 6380 8
2 7896 120
3 8042 240
4 7067 360
5 7066 625
6 7131 780
(6 row(s) affected)
Fonte: Site MCDBA Brasil
Muitas vezes temos a necessidade de numerar dinamicamente as linhas resultantes de um SELECT statement. No SQL Server 2005 podemos fazer isso facilmente utilizando a função ROW_NUMBER(), já no SQL Server 2000 as soluções são normalmente baseadas em loops e tabelas temporárias. Veja a dica desta semana e saiba como fazer isso utilizando JOIN.
No SQL Server 2000, sempre que precisamos numerar os registros resultantes de um SELECT de forma dinâmica, as sugestôes normalmente são baseadas em loops e tabelas temporárias. Para a nossa felicidade, o SQL Server 2005 vem com uma função chamada ROW_NUMBER() a qual nos permite realizar esta operação de forma bem mais simples. No exemplo abaixo, podemos ver como esta função pode ser utilizada.
USE AdventureWorks
GO
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number',
c.FirstName, c.LastName,a.PostalCode
FROM Sales.SalesPerson s
JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0
Row Number FirstName LastName PostalCode
---------- ----------- ----------- ----------
1 Shelley Dyck 98027
2 Gail Erickson 98055
3 Maciej Dusza 98027
4 Linda Ecoffey 98027
5 Mark Erickson 98055
6 Terry Eminhizer 98055
7 Michael Emanuel 98055
8 Jauna Elson 98055
9 Carol Elliott 98027
10 Janeth Esteves 98055
11 Martha Espinoza 98055
12 Carla Eldridge 98027
13 Twanna Evans 98055
A dica desta semana mostra como podemos obter este resultado no SQL Server 2000 sem precisar usar loops ou tabelas temporárias. A técnica é baseada em JOINS, o qual inclusive tende a ser bem mais performática que as soluções tradicionais.
No primeiro exemplo, utilizamos um INNER JOIN da tabela pubs..authors com ela mesma e contamos o número de vezes que o relacionamento "é maior igual que" é satisfeito, agrupando por lastname e firstname.
SELECT rank=count(*), a1.au_lname, a1.au_fname
FROM authors a1 INNER JOIN authors a2
ON a1.au_lname >= a2.au_lname
GROUP BY a1.au_lname, a1.au_fname
ORDER BY 1
rank au_lname au_fname
----------- ---------------- ---------
1 Bennet Abraham
2 Blotchet-Halls Reginald
3 Carson Cheryl
4 DeFrance Michel
5 del Castillo Innes
6 Dull Ann
7 Green Marjorie
(23 row(s) affected)
No segundo exemplo, utilizamos tabelas derivadas para obter as lojas com seus respectivos números de livros vendidos. O relacionamento é baseados no número de livros vendidos "é maior igual que".
SELECT rank=count(*), s1.stor_id, qty=sum(s1.qty)
FROM (SELECT stor_id, qty=sum(qty) FROM sales GROUP BY stor_id) s1,
(SELECT stor_id, qty=sum(qty) FROM sales GROUP BY stor_id) s2
WHERE s1.qty >= s2.qty
GROUP BY s1.stor_id
ORDER BY 1
rank stor_id qty
------- ------- ----
1 6380 8
2 7896 120
3 8042 240
4 7067 360
5 7066 625
6 7131 780
(6 row(s) affected)
Fonte: Site MCDBA Brasil
RM/SQL - Separa Nome e Sobrenome
Segue exemplo de sentença SQL para separar o Nome e o Sobrenome do Funcionário:
-- Nome
select substring(nome,1,patindex('% %',nome)) as primeiro_nome,
nome as nome_completo
from pfunc
-- Último nome (Sobrenome)
select reverse(substring(reverse(nome),1,patindex('% %',reverse(nome)))) as sobrenome,
nome as nome_completo
from pfunc
-- Nome
select substring(nome,1,patindex('% %',nome)) as primeiro_nome,
nome as nome_completo
from pfunc
-- Último nome (Sobrenome)
select reverse(substring(reverse(nome),1,patindex('% %',reverse(nome)))) as sobrenome,
nome as nome_completo
from pfunc
Assinar:
Postagens (Atom)