2016-02-04 1 views
0

J'utilise SQL Server 2012 et je souhaite créer un tableau croisé dynamique avec 4 tables jointes.Pivot et Unpivot pour 4 tables jointes SQL Server

Voilà ma question:

SELECT 
    a.Itemno, a.Qty as PlanMilling, 
    ISNULL(b.MinimStock, 0) as MinStock, 
    CAST(a.ScheduleDate as Date) AS Schedule, 
    ISNULL(SUM(c.Qty), 0) as QtyBuilding, 
    ISNULL(d.RunQty, 0) as QtyStock, 
    d.itemcode, 
    ISNULL((a.Qty + d.RunQty) - SUM(c.Qty), 0) as Balance 
FROM 
    Schedule a 
LEFT OUTER JOIN 
    Item b ON a.ItemNo = b.ItemNo 
LEFT OUTER JOIN 
    ShopOrderList c on a.ItemNo = c.ItemNo and a.ScheduleDate = c.ScheduleDate 
LEFT OUTER JOIN 
    (SELECT 
     RunQty, ItemCode 
    FROM 
     ICMutTran a 
    INNER JOIN 
     (SELECT 
       itemcode as ItemNo, max(id) as maxid 
      FROM 
       ICMutTran 
      GROUP BY 
       itemcode) AS b ON a.id = b.maxid) d ON (a.ItemNo = d.ItemCode) 
GROUP BY 
    a.ItemNo, a.Qty, b.MinimStock, a.ScheduleDate, d.RunQty, d.itemcode 

et le résultat:

ItemNo | PlanMilling | MinStock | Schedule | QtyBuilding | QtyStock | ItemCode | 
---------------------------------------------------------------------------------------------------------- 
123  | 1000   | 100   | 2016-02-04 | 200    | 1500   | 123   | 
123  | 2000   | 100   | 2016-02-05 | 100    | 1500   | 123   | 
123  | 1500   | 100   | 2016-02-06 | 150    | 1500   | 123   | 

Ce que je dois est le suivant:

ColName  | 2016-02-04 | 2016-02-05 | 2016-02-06 | 
---------------------------------------------------------------- 
PlanMilling | 1000   | 2000   | 1500   | 
MinStock | 100   | 100   | 100   | 
QtyBuilding | 200   | 100   | 150   | 
QtyStock | 1500   | 1500   | 1500   | 

Quelqu'un peut-il résoudre mon cas? J'ai vraiment besoin de votre aide (désolé pour mon mauvais anglais) ..

Merci

Répondre

1

Ce que votre PIVOT dynamiquement sur ScheduleDate. Vous pouvez utiliser ce script en réécrivant votre instruction SELECT comme

SELECT <your selects> INTO #tt FROM <the rest of your query> 

et utiliser la partie du script après les déclarations CREATE TABLE #tt et INSERT INTO #tt. Après avoir pivoté, n'oubliez pas de DROP la table temporaire.

CREATE TABLE #tt(ItemNo INT,PlanMilling INT,MinStock INT,Schedule VARCHAR(10),QtyBuilding INT,QtyStock INT,ItemCode INT); 
INSERT INTO #tt(ItemNo,PlanMilling,MinStock,Schedule,QtyBuilding,QtyStock,ItemCode)VALUES 
    (123,1000,100,'2016-02-04',200,1500,123), 
    (123,2000,100,'2016-02-05',100,1500,123), 
    (123,1500,100,'2016-02-06',150,1500,123); 

DECLARE @schedule_dates NVARCHAR(MAX)=STUFF((
    SELECT DISTINCT 
     ','+QUOTENAME(Schedule) 
    FROM 
     #tt 
    FOR 
     XML PATH('') 
    ),1,1,'' 
); 

DECLARE @stmt NVARCHAR(MAX)=N' 
    SELECT 
     ColName,' + 
     @schedule_dates+' 
    FROM 
     #tt 
     UNPIVOT (
      value 
      FOR ColName in (PlanMilling,MinStock,QtyBuilding,QtyStock) 
     ) AS up 
     PIVOT (
      MAX(value) 
      FOR Schedule IN ('[email protected]_dates+') 
     ) AS p; 
'; 
EXECUTE sp_executesql @stmt; 

DROP TABLE #tt; 

Résultats:

+-------------+------------+------------+------------+ 
| ColName | 2016-02-04 | 2016-02-05 | 2016-02-06 | 
+-------------+------------+------------+------------+ 
| MinStock |  100 |  100 |  100 | 
| PlanMilling |  1000 |  2000 |  1500 | 
| QtyBuilding |  200 |  100 |  150 | 
| QtyStock |  1500 |  1500 |  1500 | 
+-------------+------------+------------+------------+ 
+0

qui est vraiment aide, merci! mais, j'ai un petit problème quand je mets à la procédure de magasin il n'y a aucun résultat quand j'exécute la procédure de magasin – Jackques

+0

@Jackques Salut Jackques. Je suis désolé de l'entendre. Ce que vous faites maintenant, c'est d'abord reconnaître que j'ai résolu le problème que vous avez décrit dans votre question, en acceptant cette réponse. Votre question ne fait aucune mention des procédures stockées, il est donc impossible de changer maintenant ma réponse pour une question que vous posez dans un commentaire. Ce n'est pas comme ça qu'on fait les choses sur StackOverflow. Ce qui est mieux maintenant, si vous continuez à rencontrer ce problème, est de faire une nouvelle question sur StackOverflow, détaillant le nouveau problème que vous avez (c'est-à-dire que vous n'obtenez pas de sortie lors de l'exécution d'une procédure stockée). –

+0

@Jackques Lorsque vous posez cette nouvelle question, revenez à cette réponse et donnez-moi un commentaire afin que je puisse trouver votre nouvelle question. Si personne ne répond à votre nouvelle question, je l'examinerai. –

1

Voici une option à l'aide union all avec conditional aggregation (bien que ce soit un peu laid):

with cte as (
    <<your query here>> 
) 
select 'PlanMilling' ColName, 
     max(case when Schedule = '2016-02-04' then PlanMilling end) '2016-02-04', 
     max(case when Schedule = '2016-02-05' then PlanMilling end) '2016-02-05', 
     max(case when Schedule = '2016-02-06' then PlanMilling end) '2016-02-06' 
from cte 
union all 
select 'MinStock' ColName, 
     max(case when Schedule = '2016-02-04' then MinStock end) '2016-02-04', 
     max(case when Schedule = '2016-02-05' then MinStock end) '2016-02-05', 
     max(case when Schedule = '2016-02-06' then MinStock end) '2016-02-06' 
from cte 
union all 
select 'QtyBuilding' ColName, 
     max(case when Schedule = '2016-02-04' then QtyBuilding end) '2016-02-04', 
     max(case when Schedule = '2016-02-05' then QtyBuilding end) '2016-02-05', 
     max(case when Schedule = '2016-02-06' then QtyBuilding end) '2016-02-06' 
from cte 
union all 
select 'QtyStock' ColName, 
     max(case when Schedule = '2016-02-04' then QtyStock end) '2016-02-04', 
     max(case when Schedule = '2016-02-05' then QtyStock end) '2016-02-05', 
     max(case when Schedule = '2016-02-06' then QtyStock end) '2016-02-06' 
from cte 
+0

Je veux créer un pivot avec un programme dynamique de – Jackques

+0

@Jackques - Si tel est le cas, vous devrez regarder dans 'sql' dynamique avec pivotement. Plusieurs exemples sur SO. – sgeddes

+0

pouvez-vous partager ces liens avec moi? S'il vous plaît, je veux vraiment résoudre cela, même si c'est juste une syntaxe – Jackques