Organisieren Sie Daten aus der Tabelle basierend auf Spalten

stimmen
2

Ich habe eine Tabelle wie folgt und ich brauche es zu spalten, die Daten analise besser

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

und ich brauche eine Ausgabe wie diese, und ich weiß nicht, wie es zu tun!

 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    |

Ist das möglich zu tun?

Veröffentlicht am 18/12/2018 um 11:04
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
3

Ich kann nicht begreifen, wie Sie die Daten analysieren, wenn das zweite Format ist besser. Sie können dies tun, aber es ist schmerzhaft:

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;
Beantwortet am 18/12/2018 um 11:43
quelle vom benutzer

stimmen
2

Etwas wie das:

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];

Es sa voll funktionierendes Beispiel, dass Sie die Ausgabe geben kann. Sie können es ein wenig ändern, um Ihre realen Daten übereinstimmen.

Beantwortet am 18/12/2018 um 11:51
quelle vom benutzer

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