2017-10-18 2 views
-1

i ont une requête pour tableau croisé dynamique et j'obtenir ces résultats:Pivot pour tableau croisé dynamique

ItemNo | Shift | Mon | Mar | Mer |
PièceA | 1 | 10 | 20 | 30
PièceA | 2 | 40 | 50 | 60
PièceA | 3 | 70 | 80 | 90
Pièce B | 1 | 100 | 110 | 120
Pièce B | 2 | 130 | 140 | 150
Pièce B | 3 | 160 | 170 | 180

puis je veux ajouter champ quart de travail à la journée comme 'Day.Shift'

attendu:

Mon.1 | Mon.2 | Lun.3 | Tue.1 | Mar.2 | Mar.3 | Mer.1 | Wed.2 | Wed.3 |
10 | 40 | 70 | 20 | 50 | 80 | 30 | 60 | 90 |
100 | 130 | 160 | 110 | 140 | 170 | 120 | 150 | 180 |

Image:
enter image description here

Merci.

+0

Lire ceci: http://modern-sql.com/use-case/pivot –

+0

@Jackques: Dans votre réponse si vous avez Mon.1 | Mon.2 | Lun.3 | Tue.1 | Mar.2 | Mar.3, etc. Est-ce pour ItemA ou ItemA ou les deux? – JonWay

+0

@JonWay: pour les deux articles Jon. – Jackques

Répondre

2

Vous devriez faire UNPIVOT puis faire PIVOT:

DECLARE @Test TABLE 
(
    ItemNo VARCHAR(32), 
    [Shift] INT, 
    Mon  INT, 
    Tue  INT, 
    Wed  INT 
) 

INSERT @Test 
VALUES 
('ItemA', 1, 10, 20, 30), 
('ItemA', 2, 40, 50, 60), 
('ItemA', 3, 70, 80, 90), 
('ItemB', 1, 100, 110, 120), 
('ItemB', 2, 130, 140, 150), 
('ItemB', 3, 160, 170, 180) 

SELECT ItemNo, [Mon.1],[Mon.2],[Mon.3],[Tue.1],[Tue.2],[Tue.3],[Wed.1],[Wed.2],[Wed.3] 
FROM (
    SELECT ItemNo, Item + '.' + CAST([Shift] AS VARCHAR) AS Item, DayShift 
    FROM (
     SELECT ItemNo, [Shift], Mon, Tue, Wed 
     FROM @Test 
    ) p 
    UNPIVOT (
    DayShift FOR Item IN (Mon, Tue, Wed) 
    ) u 
) s 
PIVOT (
MAX(DayShift) 
FOR Item IN ([Mon.1],[Mon.2],[Mon.3],[Tue.1],[Tue.2],[Tue.3],[Wed.1],[Wed.2],[Wed.3]) 
) p