当前位置: 首页 > 编程语言 > C#

在SQLite中创建数据透视表的最佳方式是什么?分享

时间:2023-04-10 13:19:39 C#

在SQLite中创建数据透视表的最佳方法是什么?我正在使用C#和SQLite对大量数据进行分段,而且我经常需要以数据透视表的形式显示我的数据。通过使用C#从另一个查询创建SQL命令,我可以轻松地使我的数据透视表动态化,但我仍然无法决定以哪种方式进行数据透视表本身,所以我比我更想听听一些程序员对这个问题的看法。.我有3个方法。假设我们有一个名为tData的简单表,其中包含三列:“row”表示该数据的行号,“col”表示列号,“val”表示值。正统的做法是使用CASE表达式:SELECTrow,sum(CASEcolWHEN1THENvalEND)AScol1,sum(CASEcolWHEN2THENvalEND)AScol2,sum(CASEcolWHEN3THENvalEND)AScol3FROMtDataGROUPBYrow但是,我想如果我放弃CASE语句并直接在值上使用逻辑表达式,利用true==1和false==0的事实可能会更快:SELECTrow,sum((col=1)*val)AScol1,sum((col=2)*val)AScol2,sum((col=3)*val)AScol3FROMtDataGROUPBYrow我怀疑这种方法应该更快,因为CASE表达式应该有一些开销,但我不太确定。第三种方法有点复杂:它使用JOIN进行透视:SELECTrows.row,col1.valSumAScol1,col2.valSumAScol2,col3.valSumAScol3FROM(SELECTrowFROMtDataGROUPBYrow)ASrowsLEFTJOIN(SELECTrow,sum(val)ASvalSumFROMtDataWHEREcol=1GROUPBYrow)AScol1ONrows.row=col1.rowLEFTJOIN(SELECTrow,sum(val)ASvalSumFROMtDataWHEREcol=2GROUPBYrow)AScol2ONrows.row=col2.rowLEFTJOIN(SELECTrow,sum(val)ASvalSumFROMtDataWHEREcol=3GROUPBYrow)AScol3ONrows.row=col3.row事实上,那些JOIN有严重的开销,但根据我对大表的经验,SQL实现可以比对每行操作的自定义数据操作更快地执行简单的过滤器组和操作,并且超过此开销。问题是,这些类型的SQL语句生成起来比较复杂,因为每个列在语句中出现在两个地方——一次在fields子句中,一次在FROM子句中,而不是像前面两种方法那样在fields子句中.句子。另外,我需要小心所有这些临时表名称。那么,有什么意见吗?我希望case语句方法比在表上执行尽可能多的groupbys-and-joins更快,因为列中有不同的值。前者是CPU密集型,后者是磁盘密集型。例如,如果要作为列标题的列值包含星期几,则您将有七个数据透视列和七个选择组。那可能很昂贵;这取决于桌子的大小。看起来您正在使用EAV设计,这使得有必要将行移动到列中。在正确的关系数据库设计中,您不会使用EAV。列将是列,您不需要旋转。也就是说,我知道EAV有时是害处较小,当需要在数据库中存储“可扩展”属性集时,它是一种流行的设计。获取数据的最有效方法是忘记在SQL中做数据透视。只需获取每个给定值的多行属性:SELECTrow,col,valFROMtDataWHERErow=...,然后在C#应用程序中编写代码以循环遍历生成的多行结果集。为每个不同的行创建一个新对象。将对象的col字段设置为值val。然后继续取下一行查询结果。这样做有以下好处:以上是C#学习教程:在SQLite中实现数据透视表的最佳方式是什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: