2

我正在努力制作数据透视表/交叉表。最后我想内联编辑它,但首先我想至少制作表格。

在表 'tarifs' 我有一个 Id、TarifCode 和 TarifDescr 喜欢:

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

在我的申请中,我填写了开始日期、结束日期和适用的关税代码的值(金额)。像:

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

提交 SQL 查询后,填写一个表 'Occupacion',存在 ID、日期、关税代码、值,例如:

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

在与该主题相关的大多数帖子中,这些值都是已知的。就我而言,有时没有使用关税代码 A 或创建了新的关税代码。

最后,我想以 JSON 样式制作它,以便可以将其用于网格中的内联编辑。也许有人有这方面的经验?

4

1 回答 1

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

如果日期未知,则可以使用类似于以下的准备好的语句:

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

于 2013-02-20T21:52:11.113 回答