我有3个文本文件,每个文件包含20个项目的列表。 每个新日都会添加一个新列。
我想在电子表格或电子表格类型布局中显示这些项目,每列都与下一列相邻。
电子表格输出如:
10-28-09 10-29-09 10-30-09
data1 data2 data3
data1 data2 data3
data1 data2 data3
我正在考虑在mysql数据库中安排数据,并执行查询以简化流程,但我无法弄清楚如何做一些事情。
我可以安排这样的数据:
数据库架构;字段:varchar(50)
列名=日期:10-30-09(周一至周五);
查询很简单:“SELECT * FROM table1”
数据需要水平扩展,因此需要在白天创建新列。
如果我按照这样的日期安排数据,我不确定将输出到日期列中的查询是什么:
id name date
1 data1 10-28-09
2 data1 10-28-09
3 data1 10-28-09
4 data2 10-29-09
5 data2 10-29-09
6 data2 10-29-09
7 data3 10-30-09
8 data3 10-30-09
9 data3 10-30-09
我正在考虑添加一个排序列,并为每个日期的所有行增加1-20,但是你需要以某种方式加入每个日期,输出将是:
10-28-09 10-29-09 10-30-09
data1 data2 data3
data1 data2 data3
data1 data2 data3
答案 0 :(得分:1)
您不应该尝试将数据安排在数据库的数据库列中,您应该编写一个前端来安排数据。你当然不应该每天修改表格来添加一列。
您真正想要做的事情可能是数据中有20列,每天都会添加一行。然后转换数据对于您的前端来说是一个相对容易的工作,但是从您的问题中不清楚为什么要尝试这样做。
答案 1 :(得分:1)
MySQL的硬限制为4,096列:http://dev.mysql.com/doc/refman/4.1/en/column-count-limit.html
这不是理想的存储方法。按日期排列数据更好:
data1
- 该记录将不存在。TABLE
RECORD_DATE
,[虽然您已声明varchar,但我建议DATETIME] RECORD_VALUE
,varchar(50)透过/转置数据需要使用CASE表达式:
SELECT CASE WHEN t.record_date = '10-28-09' THEN t.record_value ELSE NULL END AS '10-28-09',
CASE WHEN t.record_date = '10-29-09' THEN t.record_value ELSE NULL END AS '10-29-09',
CASE WHEN t.record_date = '10-30-09' THEN t.record_value ELSE NULL END AS '10-30-09'
FROM TABLE t
参考:CASE
您可能已经注意到列是硬编码的 - 您需要考虑使用MySQL's Prepared Statements来动态创建语句。
如果您发现缺少日期,则需要考虑创建一个数字表,以便通过在给定日期添加适当的值来人为地构建日期。
答案 2 :(得分:0)
您可以尝试使用 DYNAMIC PIVOTING 来解决问题。
这里给出了一个样本。
------------------ 初始表创建&数据人口 ---------------
create table #tblpk (id int identity,groupid int)
insert into #tblpk
select 1 union all select 1 union all select 1
union all select 2 union all select 2 union all select 1
union all select 3
create table #tblfk (id int, groupdate datetime, flag int)
insert into #tblfk
select 1,'01/02/2009',1 union all
select 1,'02/02/2009',0 union all
select 1,'03/02/2009',1
----------- 程序启动 --------------------------- ----------------
- 变量声明
declare @col_list varchar(max)
declare @dynquery varchar(max)
- 步骤1:从两个表中获取所有匹配的记录
select
tpk.id id
,tfk.groupdate groupdate
,tfk.flag
into #allRectbl
from #tblpk tpk
inner join #tblfk tfk
on tpk.groupid = tfk.id
- 第2步:获取唯一的动态列
select distinct(Cols) as DynamicCols into #dynamicColumns from
(
select
IsNull(@col_list,'') +
'[' + cast(groupdate as varchar(32)) + '],' as Cols
from #allRectbl
)X(Cols)
- 步骤3:制作动态枢轴列
select @col_list = IsNull(@col_list,'') + DynCols from
(
select left(DynCols,len(DynCols)-1) DynCols
from
(
select
cast(DynamicCols as varchar(max))
from #dynamicColumns
for xml path ('')
) X(DynCols)
)Y(DynCols)
- - 第4步:进行透视
set @dynquery = 'select * ' +
'from #allRectbl ' +
'pivot ( ' +
'max(flag) ' +
'for groupdate ' +
'in (' + @col_list + ') ' +
') as pvt'
- 第5步:执行查询
exec (@dynquery)
- - 第6步:删除测试表 -------------------------
drop table #tblpk
drop table #tblfk
drop table #allRectbl
drop table #dynamicColumns