web-dev-qa-db-fra.com

TSQL PIVOT MULTIPLES COLONNES

J'ai le tableau suivant, mais je ne sais pas s'il est possible de le faire pivoter et de conserver toutes les étiquettes.

RATIO               RESULT   SCORE   GRADE
Current Ratio       1.294    60      Good
Gearing Ratio       0.3384   70      Good
Performance Ratio   0.0427   50      Satisfactory
TOTAL               NULL     180     Good

J'admets ne pas être très bon avec l'utilisation des pivots, donc après plusieurs tentatives aboutissant à cette sortie:

SELECT 'RESULT' AS 'Ratio'
  ,[Current Ratio] AS 'Current Ratio'
  ,[Gearing Ratio] AS 'Gearing Ratio'
  ,[Performance Ratio] AS 'Performance Ratio'
  ,[TOTAL] AS 'TOTAL'
FROM
(
  SELECT RATIO, RESULT 
  FROM GRAND_TOTALS
) AS SREC
PIVOT 
(
  MAX(RESULT) 
  FOR RATIO IN ([Current Ratio],[Gearing Ratio], [Performance Ratio], [TOTAL])
) AS PVT

Cela donne le résultat:

Ratio    Current Ratio   Gearing Ratio   Performance Ratio
Result   1.294           0.3384          0.0427

Je vais admettre que je suis très confus sur ce qu'il faut faire pour obtenir le résultat dont j'ai besoin, à savoir:

Ratio    Current Ratio   Gearing Ratio   Performance Ratio   TOTAL
Result   1.294           0.3384          0.0427              NULL
Score    60              70              50                  180
Grade    Good            Good            Satisfactory        Good
34
Uchenna Ebilah

Puisque vous voulez faire pivoter plusieurs colonnes de données, je suggèrerais d’abord de dé-pivoter les colonnes result, score et grade afin que vous n’ayez pas plusieurs colonnes mais que vous en ayez plusieurs. rangées.

Selon votre version de SQL Server, vous pouvez utiliser la fonction UNPIVOT ou CROSS APPLY. La syntaxe pour déporter les données sera similaire à celle-ci:

select ratio, col, value
from GRAND_TOTALS
cross apply
(
  select 'result', cast(result as varchar(10)) union all
  select 'score', cast(score as varchar(10)) union all
  select 'grade', grade
) c(col, value)

Voir SQL Fiddle avec Demo . Une fois que les données ont été libérées, vous pouvez appliquer la fonction PIVOT:

select ratio = col,
  [current ratio], [gearing ratio], [performance ratio], total
from
(
  select ratio, col, value
  from GRAND_TOTALS
  cross apply
  (
    select 'result', cast(result as varchar(10)) union all
    select 'score', cast(score as varchar(10)) union all
    select 'grade', grade
  ) c(col, value)
) d
pivot
(
  max(value)
  for ratio in ([current ratio], [gearing ratio], [performance ratio], total)
) piv;

Voir SQL Fiddle avec Demo . Cela vous donnera le résultat:

|  RATIO | CURRENT RATIO | GEARING RATIO | PERFORMANCE RATIO |     TOTAL |
|--------|---------------|---------------|-------------------|-----------|
|  grade |          Good |          Good |      Satisfactory |      Good |
| result |       1.29400 |       0.33840 |           0.04270 |    (null) |
|  score |      60.00000 |      70.00000 |          50.00000 | 180.00000 |
47
Taryn