显示数据库中的列

时间:2009-11-01 00:31:35

标签: sql mysql

我有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

3 个答案:

答案 0 :(得分:1)

您不应该尝试将数据安排在数据库的数据库列中,您应该编写一个前端来安排数据。你当然不应该每天修改表格来添加一列。

您真正想要做的事情可能是数据中有20列,每天都会添加一行。然后转换数据对于您的前端来说是一个相对容易的工作,但是从您的问题中不清楚为什么要尝试这样做。

答案 1 :(得分:1)

MySQL的硬限制为4,096列:http://dev.mysql.com/doc/refman/4.1/en/column-count-limit.html

这不是理想的存储方法。按日期排列数据更好:

  1. 不会达到列限制
  2. 它支持可选关系。例如,如果您在给定日期没有data1 - 该记录将不存在。
  3. 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