2009-07-21 5 views
1

Voici ma requêteComment créer un tableau croisé dynamique sans sommation une colonne

CREATE view pivmehis WITH ENCRYPTION 
as 
SELECT APPROVED, [Not Approved] as REJECT, NULL 
FROM 
(SELECT MgtApproval 
from LeaveRequest) l 
PIVOT 
(
Sum (SchedId) --I DON'T WANT TO SUM THIS COLUMN 
FOR MgtApproval IN 
([APPROVED], [REJECT], [NULL])) as pvt 

résultats de la table d'origine:

MgtApproval  SchedId 
Approved   1 
Reject    2 
Null    3 
Approved   4 
Reject    5 
Null    6 

Ce sont les résultats que je voudrais voir:

Approved Reject  Null 
1          2          3          
4          5          6          

Répondre

5
SELECT rn, APPROVED, [Not Approved] as REJECT, NULL 
FROM (
     SELECT MgtApproval, SchedID, ROW_NUMBER() OVER (PARTITION BY mgtapproval ORDER BY SchedID) AS rn 
     FROM LeaveRequest 
     ) l 
     PIVOT 
     (
     MIN(SchedId) 
     FOR  MgtApproval IN 
       ([APPROVED], [Not Approved], [NULL]) 
     ) as pvt 

A PIVOT a toujours besoin d'une fonction d'agrégation, mais celle-ci est garantie pour s'agréger sur au plus une colonne.

est ici la requête sur des données d'échantillon qui retourne exactement ce que vous voulez:

WITH leaveRequest aS 
(
SELECT 'APPROVED' AS mgtapproval, 1 AS SchedID 
UNION ALL 
SELECT 'Reject' AS mgtapproval, 2 AS SchedID 
UNION ALL 
SELECT 'NULL' AS mgtapproval, 3 AS SchedID 
UNION ALL 
SELECT 'APPROVED' AS mgtapproval, 4 AS SchedID 
UNION ALL 
SELECT 'Reject' AS mgtapproval, 5 AS SchedID 
UNION ALL 
SELECT 'NULL' AS mgtapproval, 6 AS SchedID 
) 
SELECT APPROVED, REJECT, [NULL] 
FROM (
     SELECT MgtApproval, SchedID, ROW_NUMBER() OVER (PARTITION BY mgtapproval ORDER BY SchedID) AS rn 
     FROM LeaveRequest 
     ) l 
     PIVOT 
     (
     MIN(SchedId) 
     FOR  MgtApproval IN 
       ([APPROVED], [Reject], [Null]) 
     ) as pvt 

Mise à jour:

Puisque vous avez mentionné que votre colonne est en fait un bit, vous devez utiliser cette syntaxe:

SELECT [1] AS approved, [0] AS reject, [-1] AS nil 
FROM (
     SELECT COALESCE(MgtApproval, -1) AS MgtApproval, SchedID, ROW_NUMBER() OVER (PARTITION BY mgtapproval ORDER BY SchedID) AS rn 
     FROM LeaveRequest 
     ) l 
     PIVOT 
     (
     MIN(SchedId) 
     FOR  MgtApproval IN 
       ([1], [0], [-1]) 
     ) as pvt 
+0

Salut merci pour votre temps. J'ai essayé votre code et m'indique une erreur: Msg 8114, niveau 16, état 1, ligne 1 Erreur lors de la conversion du type de données nvarchar en int. Msg 473, niveau 16, état 1, ligne 1 La valeur incorrecte "APPROVED" est fournie dans l'opérateur PIVOT. – Yves

+0

@Yonita: votre 'MgtApproval' semble être un entier, alors que vous le comparez à une valeur' VARCHAR' ('APPROVED'). J'ai mis à jour le post avec les exemples de données que vous avez fournis et cela fonctionne. Pourriez-vous s'il vous plaît poster votre définition de table exacte? – Quassnoi

+0

J'ai une table de consultation qui représente la valeur: MgtApproval bit Approuvé - vrai ou 1 Rejeter - false 0r 0 Null - valeur par défaut – Yves

Questions connexes