2017-05-24 1 views
0

J'utilise MS-SQLServer-2016 et j'ai besoin d'une transposition des lignes en colonnes. J'utilise Pivot et l'option SQL dynamique pour le faire car le nombre de lignes est dynamique. Figure1 est la sortie que je reçois actuellement. Cependant, le client ne veut pas que ces valeurs NULL soient affichées. Il veut seulement que les dates Not-Null soient affichées. Est-il possible de se débarrasser de ces valeurs nulles et d'afficher uniquement des dates distinctes?Microsoft SQL Server ramène la colonne à l'aide de PiVOT

Figure1-Transpose_Output

Avec Cordialement,

Tanuja

DECLARE @columns AS NVARCHAR(MAX), @sql AS NVARCHAR(MAX), @var1 AS 
VARCHAR(MAX); 

SELECT @columns = stuff((select DISTINCT ',' + quotename(replace(replace(replace(n.action_note,' ','<>'),'><',''),'<>',' ')) 
         from engagement_action n, action_party m, personal p 
         where n.action_id = m.action_id 
          and p.party_id = m.party_id 
          and n.action_note like 'XXX' 
          and m.system_name = 'XXXXXXXXXXXX' 
          and p.customer_number = 'XXXXXXX' FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') 

SELECT @sql = 

       'select "RANK_IN_PROP" , 
       customer_number, 
       customer_shortname, 
       system_name, 
       '+ @columns + ' 
       from 
        (SELECT RANK() OVER (PARTITION BY convert(date,m.created_when) ORDER BY convert(date,m.created_when))"RANK_IN_PROP" , 
          p.customer_number, 
          p.customer_shortname, 
          m.system_name, 
          m.created_when , 
          convert(date,m.created_when) as created_when, 
          replace(replace(replace(n.action_note,'' '',''<>''),''><'',''''),''<>'','' '') as action_note1 
        FROM engagement_action n, action_party m, personal p 
        WHERE n.action_id = m.action_id 
        AND p.party_id = m.party_id 
        AND n.action_note like ''%XXX%'' 
        AND m.system_name = ''XXXXXXXXXXX'' 
        AND p.customer_number = ''XXXXXXXX'') d 
        PIVOT 
        (max(created_when) for action_note1 in (' + @columns + '))p order by created_when desc' 

execute(@sql);` 
+0

[Les mauvaises habitudes pour donner le coup: en utilisant ancienne JOIN - Aaron Bertrand] (http://sqlblog.com/blogs/aaron_bertrand/archive /2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) – SqlZim

+0

Pourquoi ne créez-vous pas un jeu de résultats Table Based on Row de Table réelle que vous utilisez. –

+0

Vous devez réduire le 'de (select ...)' aux colonnes que vous voulez 'pivot() 'avec les colonnes à faire pivoter. Ensuite, joignez le résultat de votre 'pivot()' pour ajouter toutes ces autres colonnes. – SqlZim

Répondre

0

Pouvez-vous essayer, venez d'ajouter (sélectionnez engagement_action de action_note distincte où action_note est non nul) dans la clause WHERE. Comme je ne peux pas créer des données de test ne pouvait donc pas exécuter vraiment la requête

SELECT @columns = stuff((select DISTINCT ',' + 
quotename(replace(replace(replace(n.action_note,' ','<>'),'><',''),'<>',' ') 
) 
        from 
        (select distinct action_note engagement_action where action_note is not null) 
        n, action_party m, personal p 
        where n.action_id = m.action_id 
         and p.party_id = m.party_id 
         and n.action_note like 'XXX' 
         and m.system_name = 'XXXXXXXXXXXX' 
         and p.customer_number = 'XXXXXXX' FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') 
+0

Salut Srinivasa Rao, je l'ai essayé, je reçois la même sortie. La chose est même si je dis distinct de l'action_note à l'endroit où vous l'avez dit, je ne finirai avec des noms de colonnes distincts que lorsque ces lignes seront transposées. Cela n'affectera pas les dates de toute façon. –