2017-09-09 3 views
0

Ajouté table réelle de l'échantillon, ainsi que des résultats de l'échantillon ....incapable de retourner 0 lorsque aucune donnée trouvée dans la requête interne de tableau croisé dynamique, utilisé soudent aussi bien ... mais pas de chance

SELECT 'RESULT' AS Ratio, coalesce([colData1],0) data1, 
    coalesce([colData2],0) data2, coalesce([colData4],0) data4, 
    coalesce([colData7],0) data7 
FROM (SELECT columnName1,columnName2 FROM table 
where columnName3 = 'ABC' and columnName4='def' and columnName5='fgh') AS 
    SREC PIVOT (sum(columnName2) FOR columnName1 IN ([colData1],colData2 
, colData4 ,colData7)) AS PVT 

Tableau d'échantillon : Sample Table Tableau
Résultat: Sample Result for above query

- ################################# ##################

Maintenant, si je change mon ma requête:

SELECT 'RESULT' AS Ratio, coalesce([colData1],0) data1, 
coalesce([colData2],0) data2, 
coalesce([colData4],0) data4, 
coalesce([colData7],0) data7 
    FROM (SELECT columnName1,columnName2 
      FROM table where columnName3 = 'DEF' and columnName4='def' and columnName5='fgh' 
     ) AS SREC 
    PIVOT 
    (
     sum(columnName2) 
     FOR columnName1 IN ([colData1],colData2 ,colData4 ,colData7 ) 
    ) AS PVT 

Ensuite, il devrait afficher: toutes les données de la colonne de pivot comme 0 ...

Comme je l'ai 29 valeurs de données uniques pour columnName1, je suis juste essayer utiliser le tableau croisé dynamique à la place des instructions individuelles. Utilisez simplement l'agrégation conditionnelle.

+1

Modifier votre question et de fournir des exemples de données et les résultats souhaités. –

Répondre

0

Essayez ceci:

IF OBJECT_ID('tempdb..#YourTable') IS NOT NULL DROP TABLE #YourTable 
CREATE TABLE #YourTable (
    ID INT IDENTITY(1,1) NOT NULL 
    , ColumnName1 VARCHAR(20) 
    , ColumnName2 INT 
    , ColumnName3 VARCHAR(20) 
    , ColumnName4 VARCHAR(20) 
    , ColumnName5 VARCHAR(20) 
) 

INSERT INTO #YourTable 
VALUES 
    ('colData1', 1, 'ABC', 'def', 'fgh') 
    , ('colData2', 1, 'ABC', 'def', 'fgh') 
    , ('colData1', 1, 'ABC', 'def', 'fgh') 
    , ('colData4', 1, 'ABC', 'def', 'fgh') 
    , ('colData1', 1, 'ABC', 'def', 'fgh') 
    , ('colData4', 1, 'ABC', 'def', 'fgh') 
    , ('colData7', 1, 'ABC', 'def', 'fgh') 
    , ('colData1', 0, 'ABC', 'def', 'fgh') 

SELECT 
    Ratio 
    , coalesce([colData1],0) data1 
    , coalesce([colData2],0) data2 
    , coalesce([colData4],0) data4 
    , coalesce([colData7],0) data7 
FROM (SELECT 'Result' AS Ratio) x 
LEFT JOIN 
(
    SELECT * FROM (
     SELECT 
      columnName1 
      ,columnName2 
     FROM #yourtable 
     where columnName3 = 'ABC' 
      and columnName4='def' 
      and columnName5='fgh' 
     ) AS SREC 
     PIVOT ( 
      sum(columnName2) 
      FOR columnName1 IN ([colData1],[colData2],[colData4] ,[colData7]) 
     ) AS PVT 
    ) PVT ON 1=1 

Explication: Pour renvoyer une ligne, peu importe si vous avez des données ou non, vous devez d'abord vous assurer le retour d'une ligne. Dans votre table de résultats, vous avez une colonne qui est toujours renvoyée avec une valeur statique. Convertit ceci en une table (faite dans la jointure imbriquée) et joint gauche sur ceci avec quelques conditions le mot 'RESULT' est toujours retourné.

Je suppose que vous êtes seulement retourner une ligne, donc je reviens juste quelque chose qui sort de l'ensemble des résultats de la gauche se joignent à une 1=1

+0

Merci beaucoup .... :) –

+0

Glad it travaillé :) – PreQL

0

Est-ce que cela fait ce que vous voulez?

SELECT 'RESULT' AS Ratio, 
     SUM(CASE WHEN columnName1 = colData THEN columnName2 ELSE 0 END) 
FROM table 
WHERE columnName3 = 'ABC' and columnName4 = 'def' and columnName5 = 'fgh' 
+0

Merci pour la réponse. Comme suggéré, ajouté le tableau d'échantillons avec le résultat de l'échantillon ainsi .. –