视图中的MySQL交叉表

视图中的MySQL交叉表,mysql,views,pivot,crosstab,unpivot,Mysql,Views,Pivot,Crosstab,Unpivot,我有以下数据 RecordID |RecValue1 |RecValue2 |RecValue3 |Fields 1072 |130227 |0 | |Document_Number 1072 |1241388 |0 | |Supplier_Number 1072 |20008968

我有以下数据

RecordID    |RecValue1  |RecValue2  |RecValue3              |Fields
1072        |130227     |0          |                       |Document_Number
1072        |1241388    |0          |                       |Supplier_Number
1072        |20008968   |0          |                       |Invoice_Number
1072        |           |0          |1995-04-21 00:00:00    |Invoice_Date
1072        |           |0          |1995-04-23 00:00:00    |Posting_Date
1072        |Invoice    |0          |                       |Document_Type
1072        |           |0          |1995-05-12 17:46:32    |Paid_Date
1072        |F609       |0          |                       |Entry_ID

是否有一种在视图中创建交叉表的方法。“字段”列包含字段标题,每个字段都应有其关联的值,但有一个记录ID。因此,在示例中,RecordID 1072应上卷到一行。

问题的一部分是表结构。不幸的是,MySQL没有
PIVOT/UNPIVOT
函数,因此您需要使用
UNION-ALL
CASE
语句来执行此操作:

SELECT RecordId,
  MAX(CASE WHEN Fields = 'Document_Number' THEN recvalue END)  Document_Number,
  MAX(CASE WHEN Fields = 'Supplier_number' THEN recvalue END)  Supplier_number,
  MAX(CASE WHEN Fields = 'Invoice_number'  THEN recvalue END)  Invoice_number,
  MAX(CASE WHEN Fields = 'Invoice_Date' THEN recvalue END)  Invoice_Date,
  MAX(CASE WHEN Fields = 'Posting_Date' THEN recvalue END)  Posting_Date,
  MAX(CASE WHEN Fields = 'Document_type' THEN recvalue END)  Document_type,
  MAX(CASE WHEN Fields = 'Paid_Date' THEN recvalue END)  Paid_Date,
  MAX(CASE WHEN Fields = 'Entry_ID' THEN recvalue END)  Entry_ID
FROM
(
  SELECT RecordId, RecValue1 RecValue, fields
  FROM test
  UNION ALL
  SELECT RecordId, RecValue2 RecValue,fields
  FROM test
  UNION ALL
  SELECT RecordId, RecValue3 RecValue, fields
  FROM test
) unpvt
GROUP BY RecordId


此查询从三个recvalue列中获取所有值,并将其放在一列中,以便您可以将这些值转换为单行数据

当然有办法!这是一个为每个列添加联接的问题,并通过RecordId将所有内容绑定在一起每个字段关联的值是什么?您有3个recvalue字段,那么其中哪一个字段等于每条记录?RecordID将它们链接在一起。是否有一种方法可以为视图编写此字段。我不知道;I don’我认为在视图的from子句中不能有子查询。我相信您可以创建子查询的视图,然后查询该视图。因此,创建一个
UNION ALL
查询视图,然后您可以从中进行选择。啊,是的,这是一个有趣的想法。我试试看。谢谢