【问题标题】:problem organizing data组织数据的问题
【发布时间】:2011-07-24 09:48:40
【问题描述】:

我有一张如下表

RMG Date        Value
YA  11/02/2001  94
YB  11/02/2011  63
YC  11/02/2011  35
YA  12/02/2011  32
YB  12/02/2011  45
YC  12/02/2011  51
YA  13/02/2011  32
YB  13/02/2011  45
YC  13/02/2011  51

根据要求,我想提取公共日期并显示它

  RMG         11/02/2011      12/02/2011    13/02/2011
  YA           94                 32             32
  YB           63                 45             45
  YC           35                 51             51

如何使用 Java 中的表或 SQL 来实现这一点。我没有数据库背景。我很困惑解决此问题的最佳方法是什么。

【问题讨论】:

    标签: java sql swing


    【解决方案1】:

    如何找到匹配的日期并将其放入in(…)?

    select 的 pivot_in_clause 似乎接受子查询,例如:

    select distinct(Date) from DbTable
    

    附录:如果 XML 不能用于子查询,则可以使用单独的查询来确定所需的不同值。作为一个具体示例,以下方法将返回来自DBTable 的唯一日期的List。该列表适合构造pivot的IN子句。

    private static List<Date> getDates(Connection conn) throws SQLException {
        List<Date> list = new ArrayList<Date>();
        StringBuilder sb = new StringBuilder();
        Statement st = conn.createStatement();
        st.execute("select distinct(Date) from DbTable");
        ResultSet rset = st.getResultSet();
        while (rset.next()) {
            list.add(rset.getDate(1));
        }
        return list;
    }
    

    附录:可在JDBC™ Database Access 教程和Oracle® Database JDBC Developer's Guide 中找到更多指导。

    【讨论】:

    • 我试图将子查询放在数据透视表中,但在简单数据透视表中失败了......它与 XML 关键字一起工作,但我不想要 clob 或 long 数据类型......我想进入不同的不同专栏...如果你能写请这样做..这对我很有帮助。
    • 啊,我明白了。然后先运行select distinct查询,然后使用结果集根据返回值构造in子句。
    • 它会创建不同的列吗???我认为它不会......如果可能的话,请举个例子......我试图这样做但失败了......如果可以的话,请给出sql语句......应该有一个函数,但我不知道.. :( .. 它对其他人也有帮助..
    • 好的现在得到...实际上我的问题是如何为动态日期数创建不同的不同列...但是我让您想在Java性质中找出SQL查询本身...对??意思是在得到所有不同的日期后,你想把每个日期都放在java程序中来准备这种sql...但是如果你知道如何编写这样的sql,请告诉我..
    • 我会以通常的方式使用Statement 或PreparedStatement。
    【解决方案2】:

    如果您使用的是 oracle 数据库,那么您可以使用 PIVOT 函数来实现这一点,如下 -

    select * from JTable 
    pivot(sum(value) for date in ('11-Feb-2011','12-Feb-2011','13-Feb-2011'));
    

    希望它能解决你的问题。

    【讨论】:

    • 感谢您的回复。如何使其通用。我的意思是如何在运行时找到匹配的日期并将其放入 in(...) 方法中。以上只是示例。那里有很多记录。我不能硬编码。
    • 我认为在纯 SQL 中除了显式命名要旋转的列之外别无他法
    • 感谢 rabudde .. rabudde 所说的是您评论问题的正确答案.. sql 中没有办法...但是我认为在 Pl/sql 中我们可以做到这一点.. . 但还没有在 pl/sql 中尝试过.. :)
    • 我已经在 PL/sql 中完成并测试了......在 plsql 中我们可以做这种报告......@Umesh Kacha 如果你想要那个 pl/sql 代码,请告诉我跨度>
    • @Pratik 我想用 Java 构建这种报告。我只是想获取 SQL 逻辑,以便我可以用 Java 编写类似的代码。如果您共享该查询,那将是一个很大的帮助,因为我在 SQL 方面是新手。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多