微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 MySQL 中将数据从长到宽

如何解决在 MySQL 中将数据从长到宽

我有一张桌子,我想将它从长转为宽。

The long format has 3 columns: 
  zipcode,category,zipnum
  '12345','A','1'
  '40348','2'
  '16132','B','1'
  '09428','2'
  '14818','3'
  '93182','C','1'

zipnum 列是每个邮政编码的行号,按类别分组。因此 zipnum 对于类别中的每个邮政编码都是唯一的。我试图实现的宽格式具有列类别、zipcode1、...、zipcodeN,其中 N 是整个表中 zipnum 的最大值。在这个例子中 N=3,但在我的实际数据集中 N 大约是 2000。

   category,zipcode1,zipcode2,zipcode3
   'A','12345','40348',NULL
   'B','16132','09428','14818'
   'C','93182',NULL,NULL

我对 sql 比较陌生 - 我知道如何在 Python、R 等中轻松完成此操作,但找不到使用 MysqL方法。坦率地说,我真的不知道从哪里开始。

解决方法

我建议您将它们组合成一个逗号分隔的字符串:

select category,group_concat(zip_code order by zipnum) as zip_codes
from t
group by category;

因为您的字符串会很长,所以您需要将 group_concat_max_len 设置为大于其默认值的值。

你为什么不想要这些作为列?好吧,MySQL 有一个表中 4,096 列的硬限制,我认为这个限制也适用于结果集。 The limit,though,is further complicated by the storage engine and other settings.。有足够的复杂性,我只是不想动态创建可能导致数千列的查询。

您可能会发现 JSON 结构比“纯”字符串更方便。 MySQL 也支持这一点。

,

我认为使用 SQL 不容易做到这一点。例如,PostgreSQL 中有一个单独的库用于执行此操作(请参阅 here)。

但是 function DataConnection() { const [rooms,setRooms] = useState(); useEffect(() => { const db = fire.firestore(); return db.collection('rooms').onSnapshot((snapshot) => { const postData = []; snapshot.forEach((doc) => postData.push({...doc.data(),id:doc.id})); setRooms(postData); }); },[]); console.log(rooms); rooms.map((el) => { return (<><li>Roomname: { el.roomName} </li><li>Roomcode: {el.roomCode}</li></>) } 在这里可能会有所帮助,直接使用或间接使用来生成可以在该包之外使用的 SQL。我没有 MySQL,所以我在 PostgreSQL 和 SQLite 上测试了以下内容。我认为它也应该与 dbplyr 一起使用:

RMySQL

reprex package (v1.0.0) 于 2021 年 4 月 4 日创建

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。