Organizar os dados de mesa baseadas em colunas

votos
2

Eu tenho uma tabela como esta e eu preciso dividi-lo para Analisar os dados melhor

ID | doc | name    | price | pay 
1  | doc1| PERSON1 | 1     | 1
2  | doc2| PERSON1 | 10    | 0
3  | doc3| PERSON2 | 12    | 1
4  | doc4| PERSON2 | 1     | 0
5  | doc5| PERSON2 | 15    | 0
6  | doc6| PERSON3 | 2     | 1
7  | doc7| PERSON3 | 23    | 0
8  | doc8| PERSON3 | 3     | 0
9  | doc9| PERSON4 | 8     | 0

e eu preciso de uma saída como esta e eu não sei como fazê-lo!

 name         | price | pay 
 PERSON1      |       | 
 Doc1         | 1     | 1
 Doc2         | 10    | 0
 Total payed  | 1     |
 Total per pay| 10    | 
 Total        | 11    |
 PERSON2      |       | 
 Doc3         | 12    | 1
 Doc4         | 1     | 0
 Doc5         | 15    | 0
 Total payed  | 12    | 
 Total per pay| 16    | 
 Total        | 28    |
 PERSON3      |       | 
 Doc6         | 2     | 1
 Doc7         | 23    | 0
 Doc8         | 3     | 0
 Total payed  | 2     | 
 Total per pay| 26    | 
 Total        | 28    |
 PERSON4      |       | 
 Doc9         | 8     | 0
 Total payed  | 0     | 
 Total per pay| 8     | 
 Total        | 8     |
 Payed        | 15    |
 PER PAY      | 60    |
 Total SUM    | 75    |

Isso é possível fazer?

Publicado 18/12/2018 em 11:04
fonte usuário
Em outras línguas...                            


2 respostas

votos
3

Eu não consigo entender como você está analisando os dados, se o segundo formato é melhor. Você pode fazer isso, mas é doloroso:

select doc, price, pay
from ((select doc, price, pay, 2 as ord, name
       from t
      ) union all
      (select distinct name as doc, null, null, 1, name
       from t
       group by name
      ) union all
      (select 'total paid', sum(pay * price), null, 3, name
       from t
       group by name
      ) union all
      (select 'total not paid', sum( (1 - pay) * price), null, 3, name
       from t
       group by name
      ) union all
      (select 'total', sum(pay), null, 5, name
       from t
       group by name
      )
     ) t
order by name, ord;
Respondeu 18/12/2018 em 11:43
fonte usuário

votos
2

Algo assim:

DECLARE @DataSource TABLE
(
    [ID] INT
   ,[doc] VARCHAR(24)
   ,[name] VARCHAR(24)
   ,[price] INT
   ,[pay] TINYINT
);

INSERT INTO @DataSource ([ID], [doc], [name], [price], [pay])
VALUES (1, 'doc1', 'PERSON1', 1, 1)
      ,(2, 'doc2', 'PERSON1', 10, 0)
      ,(3, 'doc3', 'PERSON2', 12, 1)
      ,(4, 'doc4', 'PERSON2', 1, 0)
      ,(5, 'doc5', 'PERSON2', 15, 0)
      ,(6, 'doc6', 'PERSON3', 2, 1)
      ,(7, 'doc7', 'PERSON3', 23, 0)
      ,(8, 'doc8', 'PERSON3', 3, 0)
      ,(9, 'doc9', 'PERSON4', 8, 0);

SELECT MIN([ID]) OVER (PARTITION BY [name]) AS [ID]
      ,[ID] AS [IternalID]
      ,[doc]
      ,[price]
      ,[pay]
FROM @DataSource
UNION ALL
SELECT MIN([ID])
      ,0
      ,[name]
      ,NULL
      ,NULL
FROM @DataSource
GROUP BY [name]
UNION ALL
SELECT [ID]
      ,CASE [column]
            WHEN 'Total payed' THEN 997
            WHEN 'Total per pay' THEN 998
            WHEN 'Total' THEN 999
        END
      ,[column]
      ,[value]
      ,NULL
FROM
(
    SELECT IIF([name] IS NULL, 1000, MIN([ID]))
          ,[name]
          ,SUM(IIF([pay] = 1, [Price], 0))
          ,SUM(IIF([pay] = 1, 0, [Price]))
          ,SUM([Price])
    FROM @DataSource
    GROUP BY GROUPING SETS
    (
        [name]
       ,()
    )
) DS ([ID], [name], [Total payed], [Total per pay], [Total])
UNPIVOT
(
    [value] FOR [column] IN ([Total payed], [Total per pay], [Total])
) UNPVT
ORDER BY [ID]
        ,[IternalID];

Trata-sa exemplo de trabalho completo que pode dar-lhe a saída. Você pode mudá-lo um pouco para combinar com seus dados reais.

Respondeu 18/12/2018 em 11:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more