none
SQL DINAMICO RRS feed

  • Pergunta

  • Pessoal, bom dia.

    Atualmente realizo algumas consultas no SQL e preciso move-las para o excel para realizar alguns tratamentos e isso está demandando bastante tempo por ter que realizar essa tarefa varias vezes no dia. Afim de automatizar essas consultas, gostaria de uma ajuda para ter algum direcionamento de como personalizar a minha query para trazer a informação da forma que eu preciso. Atualmente, a consulta que eu utilizo é:

    		SELECT 
    				REGIAO 
    				,COUNT(A.MANUAL) AS 'MANUAL' 
    				,COUNT(A.AUTOMATICO) AS 'AUTOMATICO'
    				,COUNT(*) AS 'TOTAL' 
    		FROM(
    		SELECT FORMAT(CallLocalTimeStart, 'd', 'en-gb') AS DIA,
    		             CASE WHEN DURACAO >= 0 AND callduration <= 13 THEN MEMO1 ELSE NULL    END AS			'MANUAL', 
    					 CASE WHEN DURACAO >= 14  THEN MEMO1 ELSE NULL    END AS			'AUTOMATICO', 
    					 MEMO2 as REGIAO
    		FROM   eDATA..CH 		          
    		WHERE Sid in ('E1C1D7C8','EFB3C15E','E3814389','E93B9A63','E9D30982','EBD418CF','ECC78E47','E45D6423')
    		             AND MOMENT between '20191016 08:00' and '20191016 11:00'
    			) A
    		GROUP BY REGIAO
    
    

    E o resultado é esse:

    

    Gostaria que o resultado fosse apresentado assim:

    GUARUJA QTD
    MANUAL 7675
    AUTOMATICO 9033
    TOTAL 16708

    OSASCO QTD
    MANUAL 28091
    AUTOMATICO 34229
    TOTAL 62320

    TOTAL QTD
    MANUAL 35766
    AUTOMATICO 43262
    TOTAL 79028

    É possivel fazer isso?

    Agradeço desde já pela atenção.


    quarta-feira, 16 de outubro de 2019 15:00

Respostas

  • Boa tarde,

    Caíco, experimente fazer uns testes mais ou menos dessa forma:

    WITH CTE_GROUP AS
    (
        SELECT
            CASE GROUPING_ID(REGIAO) WHEN 0 THEN REGIAO ELSE 'TOTAL' END AS REGIAO,
            COUNT(A.MANUAL) AS 'MANUAL',
            COUNT(A.AUTOMATICO) AS 'AUTOMATICO'
            COUNT(*) AS 'TOTAL'
        FROM(-- TRECHO ORIGINAL
        ) A
        GROUP BY GROUPING SETS ( (REGIAO), () )
    )
    
    SELECT
        CA.REGIAO,
        CA.QTD 
    FROM CTE_GROUP
    CROSS APPLY
    (
        SELECT REGIAO, 'QTD' AS QTD
        UNION ALL
        SELECT 'MANUAL', CAST(MANUAL AS VARCHAR(10))
        UNION ALL
        SELECT 'AUTOMATICO', CAST(AUTOMATICO AS VARCHAR(10))
        UNION ALL
        SELECT 'TOTAL', CAST(TOTAL AS VARCHAR(10))
        UNION ALL
        SELECT NULL, NULL
    ) AS CA
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Sugerido como Resposta José Diz terça-feira, 22 de outubro de 2019 22:52
    • Marcado como Resposta Caíco Sousa quarta-feira, 23 de outubro de 2019 14:43
    quarta-feira, 16 de outubro de 2019 18:48

Todas as Respostas

  • Caíco, você pode realizar as consultas SQL diretamente na planilha; basta conectar a planilha ao banco de dados e utilizar o power query para montar o código SQL.

    ---

    Com relação à totalização da consulta SQL atual, uma forma é utilizar GROUPING SETS; algo assim:
         group by GROUPING SETS (REGIAO, ());

    mas também pode montar a totalização na planilha, usando fórmulas locais.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz quarta-feira, 16 de outubro de 2019 17:07
    quarta-feira, 16 de outubro de 2019 16:12
  • José,

    Eu gostaria de fazer as alterações direto na consulta pois tenho uma aplicação que gera as querys facilmente e é disponibilizado para outros usuários

    quarta-feira, 16 de outubro de 2019 16:47
  • Eu gostaria de fazer as alterações direto na consulta pois tenho uma aplicação que gera as querys facilmente e é disponibilizado para outros usuários

    Sobre "como personalizar a minha query para trazer a informação da forma que eu preciso", refere-se a adicionar linha de totalização ou alterar por qual coluna os dados são totalizados?



    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    quarta-feira, 16 de outubro de 2019 17:13
  • José,

    Eu gostaria de fazer as alterações direto na consulta pois tenho uma aplicação que gera as querys facilmente e é disponibilizado para outros usuários

    Caíco,

    Certo, você deseja enviar os dados já definidos para o Excel!

    Atualmente quantas consultas você faz?

    Qual seria o critério para tentar formatar os dados da maneira que você deseja?

    Percebo que você esta fixando o nome da coluna e adicionando o valor da coluna na frente, mas a estrutura será sempre assim?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 16 de outubro de 2019 17:23
  • Junior,

    Faço só essa consulta.

    Gostaria de exibir os dados dessa forma:

    SUL QTD
    MANUAL 7675
    AUTOMATICO 9033
    TOTAL 16708

    SUDESTE QTD
    MANUAL 28091
    AUTOMATICO 34229
    TOTAL 62320

    TOTAL QTD
    MANUAL 35766
    AUTOMATICO 43262
    TOTAL 79028

    A estrutura da consulta é dessa forma que enviei. 


    quarta-feira, 16 de outubro de 2019 18:05
  • Gostaria de exibir os dados dessa forma:
    (...)
    A estrutura da consulta é dessa forma que enviei.

    Caíco, entao é como sugerido na primeira resposta; substitua
         GROUP BY REGIAO

    por
         GROUP BY grouping sets (REGIAO, ())


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    quarta-feira, 16 de outubro de 2019 18:15
  • Usando GROUP BY grouping sets (REGIAO, ())  o resultado fica na vertical dessa forma: 

    E eu preciso que fique na horizontal assim: 

    SUL                  QTD

    MANUAL           7675
    AUTOMATICO    9033
    TOTAL              16708

    SUDESTE          QTD
    MANUAL           28091
    AUTOMATICO    34229
    TOTAL              62320

    TOTAL             QTD
    MANUAL          35766
    AUTOMATICO   43262
    TOTAL              79028


    • Editado Caíco Sousa quarta-feira, 16 de outubro de 2019 18:25
    quarta-feira, 16 de outubro de 2019 18:24
  • Boa tarde,

    Caíco, experimente fazer uns testes mais ou menos dessa forma:

    WITH CTE_GROUP AS
    (
        SELECT
            CASE GROUPING_ID(REGIAO) WHEN 0 THEN REGIAO ELSE 'TOTAL' END AS REGIAO,
            COUNT(A.MANUAL) AS 'MANUAL',
            COUNT(A.AUTOMATICO) AS 'AUTOMATICO'
            COUNT(*) AS 'TOTAL'
        FROM(-- TRECHO ORIGINAL
        ) A
        GROUP BY GROUPING SETS ( (REGIAO), () )
    )
    
    SELECT
        CA.REGIAO,
        CA.QTD 
    FROM CTE_GROUP
    CROSS APPLY
    (
        SELECT REGIAO, 'QTD' AS QTD
        UNION ALL
        SELECT 'MANUAL', CAST(MANUAL AS VARCHAR(10))
        UNION ALL
        SELECT 'AUTOMATICO', CAST(AUTOMATICO AS VARCHAR(10))
        UNION ALL
        SELECT 'TOTAL', CAST(TOTAL AS VARCHAR(10))
        UNION ALL
        SELECT NULL, NULL
    ) AS CA
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    • Sugerido como Resposta José Diz terça-feira, 22 de outubro de 2019 22:52
    • Marcado como Resposta Caíco Sousa quarta-feira, 23 de outubro de 2019 14:43
    quarta-feira, 16 de outubro de 2019 18:48
  • E eu preciso que fique na horizontal assim: 

    SUL                  QTD

    MANUAL           7675
    AUTOMATICO    9033
    TOTAL              16708

    SUDESTE          QTD
    MANUAL           28091
    AUTOMATICO    34229
    TOTAL              62320

    TOTAL             QTD
    MANUAL          35766
    AUTOMATICO   43262
    TOTAL              79028


    Caíco, agora ficou claro o leiaute; das vezes anteriores eu não consegui visualizar o resultado desejado.

    O leiaute final que você solicita está fora do conceito de tabelas; já é uma apresentação. Eis sugestão que se aproxima do que você solicita:

    -- código #1
    with 
    Consulta as (
    insira aqui o código SQL de sua consulta
    ), Padr as ( SELECT cast (coalesce (REGIAO, 'TOTAL') as sql_variant) as REGIAO, cast (MANUAL as sql_variant) as MANUAL, cast (AUTOMATICO as sql_variant) as AUTOMATICO, cast (TOTAL as sql_variant) as TOTAL from Consulta ) SELECT COLUNA1, COLUNA2 from Padr unpivot (COLUNA2 for COLUNA1 in ([REGIAO], [MANUAL], [AUTOMATICO], [TOTAL])) as U;
      

    Lembre-se de marcar esta resposta se ela te ajudou a resolver o problema.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz quinta-feira, 17 de outubro de 2019 15:08
    • Sugerido como Resposta José Diz terça-feira, 22 de outubro de 2019 22:51
    quarta-feira, 16 de outubro de 2019 19:05
  • E eu preciso que fique na horizontal assim: 

    SUL                  QTD

    MANUAL           7675
    AUTOMATICO    9033
    TOTAL              16708

    SUDESTE          QTD
    MANUAL           28091
    AUTOMATICO    34229
    TOTAL              62320

    TOTAL             QTD
    MANUAL          35766
    AUTOMATICO   43262
    TOTAL              79028


    Caíco, agora ficou claro o leiaute; das vezes anteriores eu não consegui visualizar o resultado desejado.

    O leiaute final que você solicita está fora do conceito de tabelas; já é uma apresentação. Eis sugestão que se aproxima do que você solicita:

    -- código #1
    with 
    Consulta as (
    insira aqui o código SQL de sua consulta
    ), Padr as ( SELECT cast (coalesce (REGIAO, 'TOTAL') as sql_variant) as REGIAO, cast (MANUAL as sql_variant) as MANUAL, cast (AUTOMATICO as sql_variant) as AUTOMATICO, cast (TOTAL as sql_variant) as TOTAL from Consulta ) SELECT COLUNA1, COLUNA2 from Padr unpivot (COLUNA2 for COLUNA1 in ([REGIAO], [MANUAL], [AUTOMATICO], [TOTAL])) as U;


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    José,

    Acredito que se ele utilizar o Union conforme você sugeriu anteriormente possa solucionar, pois neste caso ele teria que informar justamente para cada Union a coluna específica para ser apresentada.

    O que você acha?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 16 de outubro de 2019 22:10