2014-07-09 132 views
0

我發出以下查詢,MS SQL2008中的輸出如下。PHP + JSON格式化

查詢:

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 

輸出:

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

我使用下面的PHP腳本來獲取數據和編碼到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); 
    ?> 

產生的JSON看起來是這樣的:

[{"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}] 

不過,我需要的JSON看起來像這樣。我不確定時區類型和時區來自何處:

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

這是我的查詢或在我的PHP有問題嗎?

謝謝!

+0

IM所以這可能是錯的,但使用MySQL,你只需要一個循環用while語句中的fetch_array()。 – JStephen

+0

我認爲do {while}循環是不必要的,並且id將初始化$ json變量作爲一個空數組開始。但我想說,查詢並沒有給你你想要的,因爲這個「timezone_type」:3,「timezone」:「Asia \/Brunei」,我看你已經知道了。 – ArtisticPhoenix

回答

0

感謝您的幫助,我是能夠獲得通過不是在做這個完成在SQL中轉換並在PHP中執行。

查詢:

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 

輸出:

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

PHP:用於MySQL的

<?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

你最好在你的循環中組裝你的輸出數組,並將其設置爲你想要的特定格式。但快速循環遍歷結果你編碼之前,它會給你想要的東西:

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

foreach循環應該跟在$ json [] = $ row之後;? – solar411

+1

是的,把它放在你之前'json_encode($ json)' –

+0

否定,無法正常工作。只是在$ json變量中顯示空白而沒有任何內容。 – solar411