2015-10-05 2 views
1

Tout le monde me dire ce qui ne va pas avec mon SQL, avoir du mal avec ça aujourd'hui. L'erreur est:Lutte avec la syntaxe SQL Pivot Query

Msg 156, niveau 15, état 1, ligne 11

syntaxe incorrecte près du mot-clé 'select'.

Msg 102, niveau 15, état 1, ligne 11

syntaxe incorrecte près ')'.

SELECT * 
FROM (
    SELECT 
     left(datename(month,TransactionDateTime),3) as [month], year(TransactionDateTime) as [year], 
     count(*) as Total 
    FROM quotations 
) as s 
PIVOT 
(
    SUM(Total) 
    FOR [year] IN (select distinct year(TransactionDateTime) from quotations) 
) AS pivot 

La forme que je suis après est ... d'années que les noms de colonnes puis 12 lignes pour chaque mois. Ci-dessous est juste pour illustrer la forme

 // var data = google.visualization.arrayToDataTable([ 
     // ['Month', '2013', '2014', '2015'], 
     // ['Jan', 10, 30, 31], 
     // ['Feb', 11, 30, 32], 
     //]); 
+0

requête me semble ok, je pense que le mot pivot est un mot réservé mieux d'utiliser un autre alias ou au moins ajouter des crochets: comme [pivot] – Almazini

Répondre

0

La syntaxe de pivot est comme suit (From TechNet):

PIVOT 
(
    <aggregation function>(<column being aggregated>) 
FOR 
[<column that contains the values that will become column headers>] 
    IN ([first pivoted column], [second pivoted column], ... [last pivoted column]) 
) AS <alias for the pivot table> 

Vous pouvez voir que l'intérieur IN clause il devrait y avoir les noms de colonnes enfermés dans [] qui peuvent être un problème si les noms de colonne sont dynamiques. Ce problème peut être facilement résolu en utilisant SQL dynamique.

Voici un exemple:

DECLARE @cols AS NVARCHAR(MAX) 
DECLARE @query AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(year(TransactionDateTime)) 
      FROM Quotations 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @query = 
    'SELECT * 
    FROM (
     SELECT 
      left(datename(month,TransactionDateTime),3) as [month], year(TransactionDateTime) as [year], 
      count(*) as Total 
     FROM quotations 
    ) as s 
    PIVOT 
    (
     SUM(Total) 
     FOR [year] IN (' + @cols + ') 
    ) AS pivot' 

EXECUTE(@query) 

Je ne sais pas ce que votre schéma est donc il peut y avoir une erreur avec des noms de table/colonne. Si cela ne vous aide pas, je peux être plus précis si vous partagez votre schéma et un exemple de données.

+0

J'ai ajouté une ligne 'group by left (datename (month, TransactionDateTime), 3), année (TransactionDateTime) 'après' FROM 'Citations' dans votre solution et cela a FONCTIONNÉ! Merci – John

0

Le problème est avec la partie suivante de votre requête

(select distinct year(TransactionDateTime) from quotations) 

Vous devez fournir une liste statique des années à l'intérieur du à l'article.