Array
(
)

Consulta SQL - Crosstab

Carlos Eduardo
   - 17 mar 2010

Estou com a seguinte necessidade:

- Tenho uma tabela com a seguinte estrutura:

#Código

CODIGO      TAMANHO
----------- -------------------------
1           PP
1           P
1           M
1           G
1           GG
1           XGG
1           BB


  • Gostaria de fazer um select que me retornasse assim:
#Código
CODIGO         PP    P    M    G    GG    XGG   BB
-----------    ---   ---  ---  ---  ---   ---   ---
1              0     0    0    0    0     0     0


OBS: Ha algum tempo atras eu estava com uma duvida parecida e a mesma consegui resolver usando este comando sql ou uma storeprocedure que baixei na net chamada sp_crosstab
#Código
select P.PRD_CODIGO, P.PRD_NOME,
     SUM(CASE FIL_CODIGO WHEN 1 THEN PRD_QTDATUAL ELSE 0 END) AS F1,
     SUM(CASE FIL_CODIGO WHEN 2 THEN PRD_QTDATUAL ELSE 0 END) AS F2,
     SUM(CASE FIL_CODIGO WHEN 3 THEN PRD_QTDATUAL ELSE 0 END) AS F3
from PRODUTOS P
inner join PRDPADRAO QT on QT.PRD_CODIGO = P.PRD_CODIGO
where P.PRD_CODIGO = 417
GROUP BY P.PRD_CODIGO, P.PRD_NOME


  • Resultado
#Código
PRD_CODIGO  PRD_NOME         F1     F2     F3
----------  --------------   -----  -----  -----
417         KIT CONFIANCA    0.000  0.000  0.000


  • Mas agora nao estou conseguindo o mesmo resultado acredito que e pq agora nao posso usar um sum() por se tratar de um campo string "TAMANHO"

Thiago Santana
   - 18 mar 2010

Carlos bom dia!
Poste aí como vc está tentando fazer sua instrução SQL, para vermos oq ue está errado e podermos te ajudar!
AbraçoO

0
|
0

Emerson
   - 18 mar 2010

deve ser algo assim:

SELECT
  CODIGO,
  SUM(CASE WHEN TAMANHO = 'PP' THEN 1 ELSE 0 END) PP,
  SUM(CASE WHEN TAMANHO = 'P' THEN 1 ELSE 0 END) P,
  SUM(CASE WHEN TAMANHO = 'M' THEN 1 ELSE 0 END) M,
  SUM(CASE WHEN TAMANHO = 'G' THEN 1 ELSE 0 END) G,
  SUM(CASE WHEN TAMANHO = 'GG' THEN 1 ELSE 0 END) GG,
  SUM(CASE WHEN TAMANHO = 'XGG' THEN 1 ELSE 0 END) XGG,
  SUM(CASE WHEN TAMANHO = 'BB' THEN 1 ELSE 0 END) BB
FROM
  TAMANHOS
GROUP BY
  CODIGO

0
|
0

Emerson
   - 18 mar 2010

ou assim:

SELECT
  CODIGO,
  MAX(CASE WHEN TAMANHO = 'PP' THEN 'S' ELSE 'N' END) PP,
  MAX(CASE WHEN TAMANHO = 'P' THEN 'S' ELSE 'N' END) P,
  MAX(CASE WHEN TAMANHO = 'M' THEN 'S' ELSE 'N' END) M,
  MAX(CASE WHEN TAMANHO = 'G' THEN 'S' ELSE 'N' END) G,
  MAX(CASE WHEN TAMANHO = 'GG' THEN 'S' ELSE 'N' END) GG,
  MAX(CASE WHEN TAMANHO = 'XGG' THEN 'S' ELSE 'N' END) XGG,
  MAX(CASE WHEN TAMANHO = 'BB' THEN 'S' ELSE 'N' END) BB
FROM
  TAMANHOS
GROUP BY
  CODIGO

0
|
0

Thiago Santana
   - 18 mar 2010

Pelo o que deu para entender deve ser isso aki ki vc precisa:

SELECT
  CODIGO,
  MAX(PP) "PP",
  MAX(P) "P",
  MAX(M) "M",
  MAX(G) "G",
  MAX(GG) "GG",
  MAX(XGG) "XGG",
  MAX(BB) "BB"
FROM
  TAMANHOS
GROUP BY
  CODIGO
  Espero ter ajudado!
AbraçoO

0
|
0

Carlos Eduardo
   - 18 mar 2010

Bom dia,

Cara ThiiaGuinho e Emerson testei todos os codigos sql e ambos trouxeram o resultado esperado, mas o que eu gostaria realmente se for possivel é não precisar ter que comparar os tamanhos:

EX:
CASE WHEN GRT_TAMANHO = 'PP'
CASE WHEN GRT_TAMANHO = 'P'
CASE WHEN GRT_TAMANHO = 'M'

Pq como vc's podem perber esta tabela Grade de Tamanhos ou seja eu posso ter varias grades tornando criar essa consulta um pouco dificil. Não sei se consegui explicar direito mas resumindo onde faço as comparações dos tamanhos seria interessante fazer de uma forma automatica.

Mas agradeço a atenção de todos e qq novidade é so postar que eu faço um novo teste.

0
|
0

Thiago Santana
   - 18 mar 2010

Carlos pelo o que eu entendi vc quer escolher o tipo de tamanho em tempo de execução no delphi é isso? Montando um SQL dinâmino, de acordo com o que o usuário escolher?
Tenta explicar melhor!

0
|
0

Carlos Eduardo
   - 18 mar 2010

Consegui fazer desta maneira:

1º - Criei uma TSQLQuery (QGrade) para dar um loop nos Tamanhos (PP, P, M, G, etc...)
2º - Depois usei TSQLQuery (QAux) para realmente gerar o codigo SQL completo veja:
3º - e por ultimo usei os componentes TSQLQuery (QAux) + TDataSetProvider + TClientDataSet (CDSTam) + TDataSource e liguei no TDBGrid.

Resultado Final:

OBS: Antes eu estava com dificuldades pq nao queria dar um loop via delphi pra montar a query mas assim ficou muito bom. Valew...

0
|
0