2012-04-04 2 views
0

Je ne parviens pas à délivrer une instruction Select SQL à mon XML à utiliser pour mon graphiqueSIMPLE SQL SELECT INTO GRAPH

Je ces résultats

December 2011470FRESENIUS

January 2012434FRESENIUS

February 2012278FRESENIUS

February 20122STORESID

je dois les sortir comme ça je peux boucle mon code et générer le XML

Month YearFRESNIUSSTORESID

December 20114700

January 20124340

February 20122782

prendre note que je ne comprend pas les en-têtes, ce sont tous les résultats de la colonne. et aussi, STORESID et FRESNIUS ne sont pas des valeurs STATIQUES. Plusieurs stockeurs existent, donc j'ai eu besoin d'augmenter mon nombre de colonnes aussi, dynamiquement.

J'ai un peu besoin de sortir le second pour générer le XML correctement via PHP que j'ai déjà. Ou y a-t-il un autre moyen approprié.

Merci.

requête ci-dessous pour la sortie dont je parlais

 
SELECT 
     DATENAME(month, orderdate) + ' ' + CAST(Year(orderdate) AS VARCHAR(4)) AS 'Month Year' , 
     count(*) 'Number of Orders', 
     storerkey 
FROM orders 
GROUP BY 
     storerkey, 
     DATENAME(month, orderdate) + ' ' + CAST(Year(orderdate) AS VARCHAR(4)), 
     CAST(Year(orderdate) AS VARCHAR(4)) + RIGHT('0' + CAST(Month(orderdate) AS VARCHAR(2)),2) 
ORDER BY  
     storerkey, 
     CAST(Year(orderdate) AS VARCHAR(4)) + RIGHT('0' + CAST(Month(orderdate) AS VARCHAR(2)),2) 

    

Répondre

1

Je ne suis pas sûr à 100% de la sortie XML dont vous avez besoin, mais vous pouvez profiter de SQL-Servers FOR XML clause et de la fonction PIVOT. Cela devrait vous aider à démarrer:

CREATE TABLE #Test (GraphDate DATETIME, Value INT, Type VARCHAR(50)) 
INSERT #Test VALUES 
    ('01/12/2011', 470, 'FRESENIUS'), 
    ('01/01/2012', 434, 'FRESENIUS'), 
    ('01/12/2012', 278, 'FRESENIUS'), 
    ('01/02/2012', 2, 'STORESID') 

SELECT DATEPART(YEAR, GraphDate) [Year], 
     DATENAME(MONTH, GraphDate) [Month], 
     ISNULL(FRESENIUS, 0) [FRESENIUS], 
     ISNULL(STORESID, 0) [STORESID] 
FROM #Test 
     PIVOT 
     ( SUM(Value) 
      FOR Type IN ([FRESENIUS], [STORESID]) 
     ) PivotTable 
FOR XML PATH('row'), ROOT 

DROP TABLE #Test 

EDIT

Ce qui suit est la requête de base que vous avez demandé en fonction de la requête que vous avez donné.

SELECT DATENAME(MONTH, OrderDate) + ' ' + DATENAME(YEAR, OrderDate) [MonthYear], 
     ISNULL(FRESENIUS, 0) [FRESENIUS], 
     ISNULL(STORESID, 0) [STORESID] 
FROM Orders 
     PIVOT 
     ( COUNT(StorerKey) 
      FOR StorerKey IN ([FRESENIUS], [STORESID]) 
     ) PivotTable 
ORDER BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate) 

EDIT 2

Je ne pense pas PIVOT est pris en charge par SQL Server 2000. Vous devez utiliser des fonctions d'agrégation:

SELECT DATENAME(MONTH, OrderDate) + ' ' + DATENAME(YEAR, OrderDate) [MonthYear], 
     COUNT(CASE WHEN StorerKey = 'FRESENIUS' THEN 1 END) [FRESENIUS], 
     COUNT(CASE WHEN StorerKey = 'STORESID' THEN 1 END) [STORESID] 
FROM Orders 
GROUP BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate), DATENAME(YEAR, OrderDate), DATENAME(MONTH, OrderDate) 
ORDER BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate) 

Je pense que certains La fonctionnalité FOR XML est toujours disponible mais vous pouvez toujours être en mesure de sortir votre XML directement à partir de SQL.


EDIT 3

DECLARE @SQL NVARCHAR(2000) 
SELECT @SQL = ISNULL(@SQL, '') + ', COUNT(CASE WHEN StorerKey = ''' + StorerKey + ''' THEN 1 END) [' + StorerKey + ']' 
FROM ( SELECT DISTINCT StorerKey 
      FROM Orders 
     ) Keys 


SET @SQL = 'SELECT DATENAME(MONTH, OrderDate) + '' '' + DATENAME(YEAR, OrderDate) [MonthYear]' + @SQL + 
      ' FROM Orders 
      GROUP BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate), DATENAME(YEAR, OrderDate), DATENAME(MONTH, OrderDate) 
      ORDER BY DATEPART(YEAR, OrderDate), DATEPART(MONTH, OrderDate)' 

EXECUTE SP_EXECUTESQL @SQL 
+0

cela fonctionne pour MSSQL 2000? – Sid

+0

Ajouté une modification. Je ne pense pas que le 'PIVOT' est supporté par MSSQL 2000 donc j'ai ajouté une alternative (edit 2). – GarethD

+0

EDIT 2 fonctionne. mais seulement et seulement si le STORESID et FRESNIUS sont les colonnes. J'ai oublié de mentionner que j'utiliserais ceci pour différentes procédures et pas seulement sur la Table des Commandes. et différents clients ont différents storerskey. – Sid

1

Vous pouvez joindre la table elle-même. Si je fais des hypothèses sur les noms de colonnes, on suppose que soit la FRESNIUS ou STORESID pourraient être absents, et utiliser des expressions de table commune (non testé!):

WITH date_fresnius AS (
    SELECT [Month Year], FRESNIUS 
    FROM original_table 
) 
, date_storesid AS (
    SELECT [Month Year], STORESID 
    FROM original_table 
) 
SELECT 
     ISNULL(f.[Month Year], s.[Month Year]) AS [Month Year] 
    , ISNULL(f.FRESNIUS, 0) AS FRESNIUS 
    , ISNULL(s.STORESID, 0) AS STORESID 
FROM 
    date_fresnius f 
    FULL OUTER JOIN date_storesid s ON (f.[Month Year] = s.[Month Year]) 

Si vous avez toujours un enregistrement FRESNIUS vous pouvez utiliser un LEFT JOIN au lieu.

+0

désolé je ne suis pas tout à fait cela. mal essayer de montrer mon choix – Sid

1

Votre requête:

SELECT 
    DATENAME(MONTH, orderdate) + ' ' + CAST(YEAR(orderdate) AS VARCHAR(4)) AS [Month Year] 
    COUNT(CASE storerkey WHEN 'FRESNIUS' THEN 1 END) AS FRESNIUS, 
    COUNT(CASE storerkey WHEN 'STORESID' THEN 1 END) AS STORESID 
FROM orders 
GROUP BY YEAR(orderdate), MONTH(orderdate), DATENAME(MONTH, orderdate) 
ORDER BY YEAR(orderdate), MONTH(orderdate) 

Sortie:

Month Year  FRESNIUS STORESID 
December 2011  470   0 
January 2012   434   0 
February 2012  278   2 
+0

Fonctionne uniquement mais seulement si STORESID et FRESNIUS sont les colonnes nécessaires. mentionne que j'utiliserais ceci pour des Procédures différentes ne se concentrant pas seulement sur la Table des Commandes et différents clients ont des storerskey différents.Je peux aussi avoir plusieurs stockeurs c'est pourquoi je le fais de cette façon à la place. – Sid