2013-02-20 59 views
2

我正在努力做一個數據透視表/交叉表。最後,我想在內聯編輯它,但首先我想至少製作表格。php mysql與可變字段的交叉表

在表「tarifs」我有一個ID,TarifCode和TarifDescr 像:

1, A, Overnight 
2, P, Room 
3, V, Adult No discount 
etc. 

在我的應用程序某些時候,我填寫的開始日期,結束日期,以及適用tarifcodes值(量)。 像:

2012-02-05, 2012-02-09, A:1, P:0, V:2 

提交一個SQL查詢後填寫表格 'Occupacion',存在ID,日期,TarifCode,價值,如:

1, 2012-02-05, A, 1 
2, 2012-02-05, V, 2 
3, 2012-02-06, A, 1 
4, 2012-02-06, V, 2 
5, 2012-02-07, A, 1 
6, 2012-02-07, V, 2 
7, 2012-02-08, A, 1 
8, 2012-02-08, V, 2 
9, 2012-02-09, A, 1 
10, 2012-02-09, V, 2 

這裏是我的問題: 哪有我創建了給我的下一個輸出查詢(或視圖):

-- 2012-02-05 | 2012-02-06 | 2012-02-07 | 2012-02-08 | 2012-02-09 
A   1   1   1   1   1 
V   2   2   2   2   2 

在大多數與此主題相關的值是已知的帖子。在我的情況下,有時沒有使用TarifCode A或創建了新的TarifCode。

最後,我想以JSON風格進行設置,以便在網格中進行內聯編輯。也許有人有這方面的經驗,或可以指向我的教程?

非常感謝提前幫助我!

羅伊

回答

0

如果要執行此使用SQL,那麼你就可以在MySQL中的數據與聚合函數和CASE表達。這將採取date值,並將其轉換爲列:

select tarifcode, 
    max(case when Date = '2012-02-05' then value end) `2012-02-05`, 
    max(case when Date = '2012-02-06' then value end) `2012-02-06`, 
    max(case when Date = '2012-02-07' then value end) `2012-02-07`, 
    max(case when Date = '2012-02-08' then value end) `2012-02-08`, 
    max(case when Date = '2012-02-09' then value end) `2012-02-09` 
from yourtable 
group by tarifcode 

SQL Fiddle with Demo

如果日期是未知的,那麼你可以使用類似這樣的一份準備好的聲明:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(case when Date = ''', 
     Date, 
     ''' then value end) AS `', 
     Date, '`' 
    ) 
) INTO @sql 
FROM yourtable; 

SET @sql = CONCAT('SELECT TarifCode, ', @sql, ' 
        FROM yourtable 
        GROUP BY TarifCode'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle with Demo。兩種查詢的結果是:

| TARIFCODE | 2012-02-05 | 2012-02-06 | 2012-02-07 | 2012-02-08 | 2012-02-09 | 
------------------------------------------------------------------------------ 
|   A |   1 |   1 |   1 |   1 |   1 | 
|   V |   2 |   2 |   2 |   2 |   2 | 

編輯,如果你想加入到另一個表,那麼你可以使用類似這樣的東西:

select 
    t.tarifcode, 
    max(case when Date = '2012-02-05' then value end) `2012-02-05`, 
    max(case when Date = '2012-02-06' then value end) `2012-02-06`, 
    max(case when Date = '2012-02-07' then value end) `2012-02-07`, 
    max(case when Date = '2012-02-08' then value end) `2012-02-08`, 
    max(case when Date = '2012-02-09' then value end) `2012-02-09` 
from tarifs t 
left join yourtable y 
    on t.tarifcode = y.tarifcode 
group by t.tarifcode 

SQL Fiddle with Demo

+0

感謝您的快速回應Bluefeet!我忘了一些事,這就是我回來的原因。也許你可以再次暗示我? 我想加入TarifCode表,因此所有的TarifCodes都保留下來,所有的日期(事實上都是未知的)在最上面。只有具有值的字段才被填充。其他的是空的。 這可能嗎? 再次非常感謝您的幫助! Roy – 2013-02-20 23:04:34

+0

@RoyVissers請參閱我的編輯,您將只使用加入到其他表 – Taryn 2013-02-20 23:15:23

+0

謝謝,我擺弄它;-) – 2013-02-20 23:19:24