2014-07-09 7 views
0

Je lance la requête suivante et la sortie dans MS SQL2008 est ci-dessous.PHP + formatage JSON

Requête:

SELECT * FROM (
SELECT cast(convert(varchar(10), DATE_PULL) as DATE) as d, 
[OWNER] as label, 
sum(VM_COUNT) as value 
FROM [VCENTER_INFO_HIST] 
GROUP BY OWNER, 
DATE_PULL)sub PIVOT (MAX(value) FOR label IN (OWNER1,OWNER2,OWNER3))pvt 

Sortie:

+---------------------------------------------------------------------+ 
| D  | OWNER1  |  OWNER2  |  OWNER3  | 
+---------------------------------------------------------------------+ 
| 2014-07-07 | 443   |  456   |  487   | 
+---------------------------------------------------------------------+ 
| 2014-07-09 | 1024  |  2056  |  2076  | 
+---------------------------------------------------------------------+ 

J'utilise le script PHP ci-dessous pour récupérer les données et encode à JSON.

<?php 
    include("connect.php"); 

    /* Set up and execute the query. */ 
    $sql = "SELECT * FROM (SELECT cast(convert(varchar(10), DATE_PULL) as DATE) as d, [OWNER] as label, sum(VM_COUNT) as value FROM [VCENTER_INFO_HIST] GROUP BY OWNER, DATE_PULL)sub PIVOT (MAX(value) FOR label IN (OWNER1,OWNER2,OWNER3))pvt"; 
    $stmt = sqlsrv_query($conn, $sql); 

    /* Process results */ 
    do { 
    while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { 
    $json[] = $row; 
    } 
    } while (sqlsrv_next_result($stmt)); 

    /* Run the tabular results through json_encode() */ 
    /* And ensure numbers don't get cast to trings */ 
    echo json_encode($json); 
    /* Free statement and connection resources. */ 
    sqlsrv_free_stmt($stmt); 
    sqlsrv_close($conn); 
    ?> 

Le résultat JSON ressemble à ceci:

[{"d":{"date":"2014-07-07 00:00:00","timezone_type":3,"timezone":"Asia\/Brunei"},"OWNER1":443,"OWNER2":456,"OWNER3":487},{"d":{"date":"2014-07-09 00:00:00","timezone_type":3,"timezone":"Asia\/Brunei"},"OWNER1":1024,"OWNER2":2056,"OWNER3":2076}] 

Cependant, je dois le JSON pour ressembler à ceci. Je ne sais pas où le type de fuseau horaire et le fuseau horaire proviennent de:

[{"d":"2014-07-07","OWNER1":443,"OWNER2":456,"OWNER3":487},{"d":"2014-07-09","OWNER1":1024,"OWNER2":2056,"OWNER3":2076}] 

Est-il quelque chose de mal avec ma requête ou dans mon PHP?

Merci!

+0

im utilisé pour mysql si cela peut se tromper, mais avec MySQL, vous avez seulement besoin d'une boucle avec le fetch_array() dans l'instruction while. – JStephen

+0

Je pense que la boucle do {while} est inutile, aussi id initialise la variable $ json comme un tableau vide pour commencer. Mais je dirais que la requête ne vous donne pas ce que vous voulez aussi parce que ce "timezone_type": 3, "timezone": "Asia \/Brunei", que je vois vous savez déjà. – ArtisticPhoenix

Répondre

0

Merci pour votre aide, j'ai pu obtenir ce accompli en ne faisant pas la convertir en SQL et le faire en PHP.

Requête:

SELECT * FROM (
SELECT DATE_PULL as d, 
[OWNER] as label, 
sum(VM_COUNT) as value 
FROM [VCENTER_INFO_HIST] 
GROUP BY OWNER, 
DATE_PULL)sub PIVOT (MAX(value) FOR label IN (OWNER1,OWNER2,OWNER3))pvt 

Sortie:

+---------------------------------------------------------------------+ 
| D  | OWNER1  |  OWNER2  |  OWNER3  | 
+---------------------------------------------------------------------+ 
| 07-07-2014 | 443   |  456   |  487   | 
+---------------------------------------------------------------------+ 
| 07-09-2014 | 1024  |  2056  |  2076  | 
+---------------------------------------------------------------------+ 

PHP:

<?php 
include("connect.php"); 

/* Set up and execute the query. */ 
$sql = "SELECT * FROM (SELECT DATE_PULL as d, [OWNER] as label, sum(VM_COUNT) as value FROM [VCENTER_INFO_HIST] GROUP BY OWNER, DATE_PULL)sub PIVOT (MAX(value) FOR label IN (OWNER1,OWNER2,OWNER3))pvt"; 
$stmt = sqlsrv_query($conn, $sql); 

/* Process results */ 
do { 
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { 
$json[] = $row; 
} 
} while (sqlsrv_next_result($stmt)); 

foreach($json as &$each) { 
// reformat date column 
$each['d'] = date('Y-m-d', strtotime($each['d'])); 
} 


/* Run the tabular results through json_encode() */ 
/* And ensure numbers don't get cast to strings */ 
echo json_encode($json); 
/* Free statement and connection resources. */ 
sqlsrv_free_stmt($stmt); 
sqlsrv_close($conn); 
?> 
2

Vous feriez mieux d'assembler votre tableau de sortie pendant votre boucle, et de le régler au format spécifique que vous voulez. Mais une boucle rapide sur les résultats avant de vous encodez il vous donnera ce que vous voulez:

foreach($json as &$each) { 
    // reassign "d" key to just the date (formatted), discard the rest 
    $each['d'] = date('Y-m-d', strtotime($each['d']['date'])); 
} 

echo json_encode($json); 

Output:

[{"d":"2014-07-07","OWNER1":443,"OWNER2":456,"OWNER3":487},{"d":"2014-07-09","OWNER1":1024,"OWNER2":2056,"OWNER3":2076}] 
+0

La boucle foreach devrait aller après la ligne $ json [] = $ ;? – solar411

+1

Ouais, mettez le juste avant que vous json_encode ($ json) ' –

+0

Négatif, ne fonctionne pas. Juste apparaît vide et rien dans la variable $ json. – solar411