精华内容
下载资源
问答
  • SpingMVC IReport多数据源交叉报表示例

    千次阅读 2015-11-08 14:13:30
    SpingMVC IReport多数据源交叉报表示例 Author: 许亮 Create: 2015-11-8 0:08:41 一、特别说明  开始本示例之前,有必要先阅读我先前发布的 《SpringMVC与iReport(JasperReports) 5.6整合开发实例》...

    SpingMVC IReport多数据源交叉报表示例


    Author: 许亮
    Create: 2015-11-8 0:08:41

    一、特别说明

      开始本示例之前,有必要先阅读我先前发布的《SpringMVC与iReport(JasperReports) 5.6整合开发实例》这篇博文,只有熟悉了SpringMVC与iReport的整合基础之后,才能更容易上手本示例教程,因为本示例的重点在于iReport报表模板的设计。
      开始之前,先来预览下最终的报表效果:

      20151108122829259

    二、开发环境

    • 操作系统: Windows 7 x64
    • JDK: JDK 1.7.0_79 x64
    • 开发IDE: Eclipse Luna Service Release 2 (4.4.2) x64
    • Maven: Apache Maven 3.2.3
    • iReport: Jaspersoft iReport Designer 5.6.0

    三、开发过程

    3.1 主要依赖包(pom.xml中)

    <!-- iReport JasperReports -->
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports</artifactId>
        <version>5.6.0</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.2.2</version>
    </dependency>
    
    <!-- JFreeChart -->
    <dependency>
        <groupId>org.jfree</groupId>
        <artifactId>jfreechart</artifactId>
        <version>1.0.19</version>
    </dependency>

    3.2 数据建模

    3.2.1 Person实体类

      此模型类主要实现报表中的数据清单展示。

    package com.pes_soft.example.model;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * iReport subDataset测试bean: Person实体类
     * @Author 许亮
     * @Create 2015-1-15 20:32:27
     */
    public class JavaBeanPerson {
        private String name;    // 姓名
        private String sex;     // 性别
        private int age;        // 年龄
        private String hometown;// 籍贯
        private String phone;   // 电话号码
    
        public JavaBeanPerson() {}
    
        public JavaBeanPerson(String name, String sex, int age, String hometown, String phone) {
            this.name = name;
            this.sex = sex;
            this.age = age;
            this.hometown = hometown;
            this.phone = phone;
        }
    
        // 此处省略字段的getter和setter
    
        public static List<JavaBeanPerson> getList() {
            List<JavaBeanPerson> list = new ArrayList<JavaBeanPerson>();
            list.add(new JavaBeanPerson("Lily", "female", 22, "Hubei", "10086"));
            list.add(new JavaBeanPerson("Macro", "male", 33, "Beijing", "13800000000"));
            list.add(new JavaBeanPerson("Andy", "male", 44, "HongKong", "13812345678"));
            list.add(new JavaBeanPerson("Linder", "female", 28, "Guangxi", "18677778888"));
            list.add(new JavaBeanPerson("Jessie", "female", 26, "Gansu", "18219177720"));
            return list;
        }
    }

    3.2.2 颜色实体类

      此模型类主要实现报表中的柱状图展示。

    package com.pes_soft.example.model;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * iReport subDataset测试bean: 颜色实体类
     * @Author 许亮
     * @Create 2015-1-15 20:13:27
     */
    public class JavaBeanColor {
        private String color;   // 颜色名
        private int count;      // 计数
    
        public JavaBeanColor() {}
    
        public JavaBeanColor(String color, int count) {
            this.color = color;
            this.count = count;
        }
    
        // 此处省略字段的getter和setter
    
        public static List<JavaBeanColor> getList() {
            List<JavaBeanColor> list = new ArrayList<JavaBeanColor>();
            list.add(new JavaBeanColor("Red", 36));
            list.add(new JavaBeanColor("Green", 59));
            list.add(new JavaBeanColor("Blue", 27));
            list.add(new JavaBeanColor("Yellow", 8));
            list.add(new JavaBeanColor("Gray", 19));
            return list;
        }
    }

    3.2.3 颜色实体类

      此模型类主要实现报表中的柱状图展示。

    package com.pes_soft.example.model;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * iReport subDataset测试bean: 水果实体类
     * @Author 许亮
     * @Create 2015-1-15 20:03:57
     */
    public class JavaBeanFruit {
        private String name;    // 水果名称
        private int qty;        // 数量
    
        public JavaBeanFruit() {}
    
        public JavaBeanFruit(String name, int qty) {
            this.name = name;
            this.qty = qty;
        }
    
        // 此处省略字段的getter和setter
    
        public static List<JavaBeanFruit> getList() {
            List<JavaBeanFruit> list = new ArrayList<JavaBeanFruit>();
            list.add(new JavaBeanFruit("Apple", 40));
            list.add(new JavaBeanFruit("Banana", 28));
            list.add(new JavaBeanFruit("Orange", 37));
            list.add(new JavaBeanFruit("Grape", 15));
            list.add(new JavaBeanFruit("Pear", 21));
            return list;
        }
    }

    3.3 创建报表数据源封装类

    package com.pes_soft.example.ds;
    
    import java.util.List;
    
    import net.sf.jasperreports.engine.JRDataSource;
    import net.sf.jasperreports.engine.JRException;
    import net.sf.jasperreports.engine.JasperReport;
    import net.sf.jasperreports.engine.data.JRAbstractBeanDataSourceProvider;
    import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
    
    /**
     * iReport数据源封装
     * @author 许亮
     * @Create 2015-1-15 15:42:52
     */
    public class IReportDataSourceProvider extends JRAbstractBeanDataSourceProvider {   
        private List<?> dataList;
    
        public IReportDataSourceProvider(Class<?> beanClass) {
            super(beanClass);
        }
    
        public IReportDataSourceProvider(Class<?> beanClass, List<?> dataSourceList) {
            super(beanClass);
            this.dataList = dataSourceList;
        }
    
        public JRDataSource create(JasperReport report) throws JRException {
            return new JRBeanCollectionDataSource(this.dataList);
        }
    
        public void dispose(JRDataSource dataSource) throws JRException {
            this.dataList = null;
        }
    }

    3.4 编写报表访问的视图控制器方法

    package com.pes_soft.example.ctrler;
    
    import java.text.DateFormat;
    import java.util.Date;
    import java.util.Locale;
    
    import net.sf.jasperreports.engine.JRDataSource;
    import net.sf.jasperreports.engine.JRException;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import com.pes_soft.example.constant.IReportFormat;
    import com.pes_soft.example.constant.IReportParam;
    import com.pes_soft.example.ds.IReportDataSourceProvider;
    import com.pes_soft.example.model.JavaBeanColor;
    import com.pes_soft.example.model.JavaBeanFruit;
    import com.pes_soft.example.model.JavaBeanPerson;
    
    /**
     * Handles requests for the application home page.
     */
    @Controller
    public class HomeController {
    
        private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
    
        /**
         * Simply selects the home view to render by returning its name.
         */
        @RequestMapping(value = "/", method = RequestMethod.GET)
        public String home(Locale locale, Model model) {
            logger.info("Welcome home! The client locale is {}.", locale);
    
            Date date = new Date();
            DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
    
            String formattedDate = dateFormat.format(date);
            model.addAttribute("serverTime", formattedDate );
    
            return "home";
        }
    
        /**
         * 返回iReport报表视图
         * @param model
         * @return
         */
        @RequestMapping(value = "/report", method = RequestMethod.GET)
        public String report(Model model) {
            // 报表数据源
            JRDataSource jrDataSourceMain_Person = null;
            JRDataSource jrDataSourceSub_Color = null;
            JRDataSource jrDataSourceSub_Fruit = null;
    
            try {
                IReportDataSourceProvider dataSourcePerson = new IReportDataSourceProvider(JavaBeanPerson.class, JavaBeanPerson.getList());
                jrDataSourceMain_Person = dataSourcePerson.create(null);
    
                IReportDataSourceProvider dataSourceColor = new IReportDataSourceProvider(JavaBeanColor.class, JavaBeanColor.getList());
                jrDataSourceSub_Color = dataSourceColor.create(null);
    
                IReportDataSourceProvider dataSourceFruit = new IReportDataSourceProvider(JavaBeanFruit.class, JavaBeanFruit.getList());
                jrDataSourceSub_Fruit = dataSourceFruit.create(null);
            } catch (JRException e) {
                e.printStackTrace();
            }
    
            model.addAttribute("url", "/WEB-INF/jasper/MvcMultiDsCrossReportExample.jasper");   // 报表模板
            model.addAttribute("format", IReportFormat.pdf.name());             // 报表输出格式
            model.addAttribute("jrMainDataSource", jrDataSourceMain_Person);    // 报表主数据源
            model.addAttribute("jrColorDataSource", jrDataSourceSub_Color);     // 报表子数据源1(柱状图[Bar Chart])
            model.addAttribute("jrFruitDataSource", jrDataSourceSub_Fruit);     // 报表子数据源2(饼图[Pie Chart])
    
            return IReportParam.IREPORT_VIEW; // 对应jasper-defs.xml中的bean id
        }
    }

    四、iReport报表模板的设计

    4.1 创建主数据源字段(jrMainDataSource)

      注意字段的类型与模型JavaBeanPerson.java中的字段类型保持一致。创建字段的过程就不赘述了,直接上图。

      

    4.2 创建报表参数(即报表的子数据源)

      为报表创建两个参数,jrColorDataSource和jrFruitDataSource,此两参数最终会转换为报表的两个子数据源,分别作为柱状图和饼图的数据源。创建报表参数的操作如下:

      

      然后将参数重命名为“jrColorDataSource”。
      接下来需要设置该报表参数的两个属性:
      ◆ Parameter Class(参数类):net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
      ◆ Use as a prompt(是否弹出窗口以输入报表参数):去掉勾勾,即不弹出窗口

      

      至此,报表参数jrColorDataSource创建完成。另一个参数jrFruitDataSource的创建过程亦与此相同。

      

    4.3 创建报表数据源

      为报表创建两个空的DataSet,分别重命名为subColorDataSet和subFruitDataSet。

      

      

      给DataSet创建字段,字段名分别对应Java实体模型JavaBeanColor.java、JavaBeanFruit.java中的字段,注意字段数据类型的一致性。

      

    4.4 设计报表模板

      在报表iReport报表设计器中,可以删除一些不需要的Band。这里特别要注意的是,像柱状图、饼图这些图表对象,只能放在“Summary” Band里面。

      

      将组件面板中的“Chart”拖入到“Summary” Band里面,然后选择你想要的图表类型。这里先创建一个柱状图(Bar Chart)。

      20151108133427244

      指定柱状图所使用的DataSet。在4.3步骤里创建的两个空的DataSet就在这里派上用场了。这里就直接指定柱状图使用“subColorDataSet”这个DataSet,剩下的一个“subFruitDataSet”就留作饼图的数据集合。

      20151108133658167

      输入数据序列名称,这一步非必须,可以直接“下一步”跳过。

      

      指定报表的Category(分类)和Value(值)。这里的Category即Y轴,Value即X轴。

      20151108134015106

      同样的方法创建一个饼图。根据自己的需要,可以自由调整图表的尺寸。最终的报表模板效果如下:

      20151108134122090

    4.5 数据关联转换

      回顾下报表模板的设计过程:
      ■ 创建了两个报表“Parameters(参数)”:jrColorDataSource和jrFruitDataSource,并且指定它们的“Parameter Class”为net.sf.jasperreports.engine.data.JRBeanCollectionDataSource。
      ■ 创建了两个空的“DataSet(数据集)”:subColorDataSet和subFruitDataSet,其中,
       subColorDataSet对应Java实体模型JavaBeanColor.java,两者字段保持一致;
       subFruitDataSet对应Java实体模型JavaBeanFruit.java,两者字段保持一致。
      ■ 创建了一个柱状图图表,指定使用的DataSet为“subColorDataSet”。
      ■ 创建了一个饼图图表,指定使用的DataSet为“subFruitDataSet”。

      至此,报表模板的设计似乎已经完成,非也!如果此时编译报表模板,将得到的.jasper文件放入/WEB-INF/jasper/目录中,并不能得到想要的报表,原因是:创建了两个空的“DataSet(数据集)”。

      我们一开始就创建了两个报表“Parameters(参数)”,那么接下来要做的就是:把报表“Parameters(参数)”赋值给两个空的“DataSet(数据集)”。

      选中一个图表对象,右键菜单中点击“Chart Data”。

      

      关键操作步骤为:
      ◆ 选择“Sub dataSet”为:subColorDataSet;
      ◆ 选择“Connection / DataSet Expression”为:Use datasource expression;
      ◆ 选择或设置上述表达式的值为:$P{jrColorDataSource},即其中一个报表“Parameters(参数)”。
      这样就完成了报表“Parameters(参数)”到报表“DataSet(数据集)”的数据关联转换。饼图同样要如此设置。

      20151108134332902

    五、编译与运行

      编译报表模板,将得到的.jasper文件放入/WEB-INF/jasper/目录中,通过浏览器访问地址“http://localhost:8080/multids/report”查看报表(PDF格式)。如果能正常访问,说明你已经掌握了SpringMVC iReport多数据源交叉报表的的开发技术(至少本例中使用了三个不同的数据源,一个主数据源,两个子数据源)。

      Eclipse中导入本实例时,若访问时出现404错误,可能需要设置项目的ContextPath。在项目属性中找到“Web Project Settings”,然后修改即可。

      

      项目源码:mvc-ireport-multi-ds.rar

    展开全文
  • JasperReport报表开发之转置交叉表

    千次阅读 2015-07-24 09:05:35
    使用Jasper或BIRT等报表工具时,常会碰到一些非常规的统计,用报表工具本身或SQL都难以处理,比如源数据不符合交叉表的要求,需要转置后再呈现。集算器具有结构化强计算引擎,集成简单,可以协助报表工具方便地实现...

       使用Jasper或BIRT等报表工具时,常会碰到一些非常规的统计,用报表工具本身或SQL都难以处理,比如源数据不符合交叉表的要求,需要转置后再呈现。集算器具有结构化强计算引擎,集成简单,可以协助报表工具方便地实现此类需求。下面通过一个例子来说明转置交叉表的实现过程。

       数据库表booking汇总着各年度商品的预定数据,有四个字段,包括年份和三种预定状态,部分数据如下:


       报表要求呈现指定年份及上一年的预定情况,其中行组有三项,即三种预定状态,列组是年份,测度是当年的预定数据。此外要汇总出指定年份各预定状态的增长率。表样如下:


       可以看到,这张报表的难点是:源数据无法直接用于交叉表,汇总列要用相对位置来动态计算。如果能将源数据转置,并将汇总列事先计算出来,则会显著降低难度,比如下面这样:

       下面用集算器准备报表所需的数据,代码如下:


       A1=yearBegin=yearEnd-1

       yearEnd是来自报表的参数,表示用户指定的年份,比如2014。A1中的代码用来计算上一年(比如2013),为了方便引用,上一年定义为yearBegin。

      A2=myDB1.query(“select * from booking where year between ? and ? order by year desc”,yearBegin,yearEnd)

      这句代码用来从数据库查出指定年份及上一年的数据。myDB1是数据源名,指向MYSQL。函数query可执行SQL语句,也可以接受参数。假设yearEnd=2014,则A2的计算如下:


      A3=create(row,col,value)

      这句代码用来新建序表A3。A3有三个字段:row、col、value,将来可存储整理之后的数据。新建后的A3如下:

      需要注意的是,序表类似数据库结果集,也是结构化二维表,但序表是泛型的,同一个字段可以存储不同的数据类型,序表也是有序的,可以按序号访问数据。利用序表的这些特点可以方便地实现本案例。

      A4: for ["visits","bookings","successfulbookings"]

      这句代码对集合["visits","bookings","successfulbookings"]进行循环访问,在循环中向A3追加数据,最终准备出报表需要的数据。for语句的作用范围是B4-C7,用自然的缩进就可以表示,无需括号或begin/end等标记。在作用范围里可以用A4来引用循环变量,即for语句所在单元格的格名。比如进行第一遍循环时,A4的值等于”visits”。

      下面看循环体中的代码。

      B4=endValue=eval(“A2(1).”+A4)

      这句代码可从A2动态地取出第一条记录的预定状态数据。函数eval可将字符串解析为表达式,比如第一遍循环时,“A2(1).”+A4会被解析为A2(1).visits,计算结果是500。其中“A2(1)”表示第一条记录,“.visits”表示取出该记录的visits字段,即下图红框处:

       C4=beginValue=eval(“A2(2).”+A4)

       和endValue类似,beginValue从A2中动态地取出第二条记录的预定状态数据。第一遍循环时,endValue等于400。

      B5=A3.insert(0,A4,A2(1).year,endValue)

      C5=A3.insert(0,A4,A2(2).year,beginValue)

       这两句代码向A3追加记录。函数insert可以向序表插入记录,第一个参数可以指定插入的位置,如果这个参数为0,则表示在最后追加记录。

       比如第一遍循环时,B5追加的记录是:”visits”、2014、500,C5追加的记录是”visits”、2013,400。追加后A3如下:

      B6=endValue/beginValue-1

      这句代码计算指定年份的增长率,比如第一遍循环时,B6=500/400-1=0.25。

      C6=if(B6>0:”+”,B6<0:”-”)+string(B6,”#%”)

      这句代码用来格式化B6,算法是:如果B6大于0,则在百分数前面加“+”号,如果小于0,则加“-”号。比如第一遍循环时,C6=”+25%”。注意:格式化数据适合用报表实现,所以本步骤并非必须。

      B7=A3.insert(0,A4,string(yearEnd)+”/”+string(yearBegin),C6)

      这句代码向A3追加新记录,比如第一遍循环时,插入的记录是”visits”,”2014/2013”,”+25%”,如下图:

      值得注意的是,这次插入的记录都是字符串,和之前的类型不同。

      整个循环执行后,报表需要的数据就会全部追加在A3中,如下:

       result A3
       这句代码将A3返回给报表工具。集算器对外提供JDBC接口,报表工具会将集算器识别为普通数据库,集成方案请参考相关文档。

       接下来以JasperReport为例设计一张简单的交叉表,模板如下:

      报表中需要定义一个参数pyearEnd,用来对应集算器中的参数。预览后可以看到报表结果:


       报表调用集算器的方法和调用存储过程一样,比如将本脚本保存为booking.dfx,则在JasperReport的SQL设计器中可以用booking $P{pendYear}来调用。

    展开全文
  • 在本文,我们通过配置数据源进行报表实战,做过报表开发的报表达人知道,报表中的数据源分设计时数据源和运行时数据源

    在上讲中《ActiveReports 9实战教程(1): 手把手搭建环境Visual Studio 2013 社区版》,我们已经结合Visual Studio 2013搭建好了ActiveReports 9的开发环境,并完成了一个Hello World的RDL报表。 在本文,我们通过配置数据源进行报表实战,做过报表开发的报表达人知道,报表中的数据源分设计时数据源和运行时数据源。 如何理解呢?

    image

    这2类数据源,表结构是一样的,用途不一样:

    1 设计时数据源,用于研发内部、报表小组进行配置、测试报表用。

    2 运行时数据源,用于系统割接后在局方现场运行报表系统,如修改链接数据库的字符串。

    从上面2点可看出,设计时数据源的运行比较广:配置报表、测试、运行报表。而运行时数据库切换数据库链接字符串即可无缝实现数据源在用户现场部署,相对比较容易。

    下面用NWind_CHS.mdb数据源进行实战(AR9安装后,自带的数据源‪C:\Users\rogerwang\Documents\ComponentOne Samples\ActiveReports 9\Data\NWIND.mdb)。

    设计时数据源

    通过“视图--其他窗口--报表资源管理器 V9”,然后基于上讲的RdlReport1.rdlx文件,双击rdlx文件。

    image

    右键,添加数据源

    image

    在新创建的数据源DataSource1,右键添加数据集。

    image

     

    在弹出的添加数据集中,有2种办法添加数据。

    image

    方法一: 直接写SQL。 这种方式适合程序员、SQL比较强的人, 效率高。

    方法二: 通过AR9新提供的VQD进行(可视化查询设计器)。这种方法适合产品经理、需求分析师等对技术不细究的人,灵活。

    这里重点说一下方法二:VQD。

    可视化查询设计器(VQD)包含以下关键特性:

    • 过滤数据
    • 使用自定义表达式
    • 从数据库选择字段
    • 分组和合计函数
    • 使用内连接,左外连接和右外连接
    • 设置已选字段和数据表的别名
    • 数据排序和更多特性

    image

     

    image

     

    生成的SQL语句:

    select Products.*, Categories.* from Products inner join Categories on Products.CategoryID = Categories.CategoryID

     

    image

     

    如分别拖动Description、ProductID到报表,预览结果:

    image

     

    image

    至此,完成了运行时数据源的添加,AR提供的配置数据源功能,非常灵活和方便,可有效的提高报表开发效率。

    运行时数据源

    我们在设计时配置的数据源,如果要迁移到用户现场,则需要可以动态修改数据源以适配用户的数据源环境。

    可通过代码实现数据源切换(备注:数据库表结构是一模一样的)

    private void 运行时数据源区域报表ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SectionReport_DataSource_RunTime sReport1 = new SectionReport_DataSource_RunTime();
            sReport1.DataSource = GetDataSource();
            sReport1.Run();
            viewer1.Document = sReport1.Document;
        }
    
        private DataTable GetDataSource()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("产品编号");
            dt.Columns.Add("产品名称");
            dt.Columns.Add("单价");
            dt.Columns.Add("库存量");
            dt.Rows.Add("A10002", "苹果", 20, 50);
            dt.Rows.Add("A15681", "香蕉", 20, 50);
            dt.Rows.Add("A15681", "菠萝", 20, 50);            
            return dt;
        }

    在运行时通过 DataSource 属性设置数据源

     

    private void 运行时数据源页面报表ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            GrapeCity.ActiveReports.PageReport pReport1 = new GrapeCity.ActiveReports.PageReport(new System.IO.FileInfo("PageReport_DataSource_RunTime.rdlx"));
            viewer1.LoadDocument(pReport1.Document);            
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            viewer1.LocateDataSource += new GrapeCity.ActiveReports.LocateDataSourceEventHandler(viewer1_LocateDataSource);
        }
        void viewer1_LocateDataSource(object sender, GrapeCity.ActiveReports.LocateDataSourceEventArgs args)
        {
            if (args.DataSourceName == "DataSource1")
            {
                if (args.DataSetName == "DataSet1")
                {
                    args.Data = GetDataSource();
                }
            }
        }
        private DataTable GetDataSource()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("产品编号");
            dt.Columns.Add("产品名称");
            dt.Columns.Add("单价");
            dt.Columns.Add("库存量");
            dt.Rows.Add("A10002", "苹果", 20, 50);
            dt.Rows.Add("A15681", "香蕉", 20, 50);
            dt.Rows.Add("A15681", "菠萝", 20, 50);
            return dt;
        }

    在运行时通过 LocateDataSource 事件加载数据源。

    最后,顺便说一下:ActiveReport 可以和多种数据源交互,包括OLEDB, SQL, XML,Oracle、Sybase、Informix、SQL Server等。

    参考的官方博客:

    ----------------------------------------------------------------------------------------------------------

    ActiveReports 9实战教程目录:

    
    展开全文
  • postgresql 创建数据表。临时

    千次阅读 2015-05-23 23:39:30
    CREATE TABLE -- 定义一个新 Synopsis CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( { column_name data_type [ DEFAULT default_expr ] [ column_constraint

    CREATE TABLE

    Name

    CREATE TABLE -- 定义一个新表

    Synopsis

    CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
      { column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ]
        | table_constraint
        | LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] }  [, ... ]
    )
    [ INHERITS ( parent_table [, ... ] ) ]
    [ WITH OIDS | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE tablespace ]
    
    这里 column_constraint 可以是:
    
    [ CONSTRAINT constraint_name ]
    { NOT NULL |
      NULL |
      UNIQUE [ USING INDEX TABLESPACE tablespace ] |
      PRIMARY KEY [ USING INDEX TABLESPACE tablespace ] |
      CHECK (expression) |
      REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
        [ ON DELETE action ] [ ON UPDATE action ] }
    [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
    
    而 table_constraint 可以是:
    
    [ CONSTRAINT constraint_name ]
    { UNIQUE ( column_name [, ... ] ) [ USING INDEX TABLESPACE tablespace ] |
      PRIMARY KEY ( column_name [, ... ] ) [ USING INDEX TABLESPACE tablespace ] |
      CHECK ( expression ) |
      FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
        [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }
    [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

    描述

    CREATE TABLE 将在当前数据库创建一个新的, 初始为空的表。该表将由发出此命令的用户所有。

    如果给出了模式名(比如,CREATE TABLE myschema.mytable ...), 那么表是在指定模式中创建的。否则它在当前模式中创建。临时表存在于一个特殊的模式里, 因此创建临时表的时候不能给出模式名。表名字必需是在同一模式中其他表,序列,索引或者视图名字中唯一的。

    CREATE TABLE 还自动创建一个数据类型, 该数据类型代表对应该表一行的复合类型。 因此,表不能和同模式中的现有数据类型同名。

    可选的约束子句声明约束(测试),新行或者更新的行必须满足这些约束才能成功插入或更新。 约束是一个它是一个 SQL 对象,它以多种方式协助我们协助我们在表上定义有效的数值集合。

    定义约束又两种方法:表约束和列约束。一个列约束是作为一个列定义的一部分定义的。 而表约束并不和某个列绑在一起, 它可以作用于多于一个列上。每个列约束也可以写成表约束; 如果某个约束只影响一个列,那么列约束只是符号上的简洁方式而已。

    参数

    TEMPORARY 或 TEMP

    如果声明了此参数,则该表创建为临时表。临时表在会话结束时自动删除, 或者是(可选)在当前事务的结尾(参阅下面的 ON COMMIT)。 现有同名永久表在临时表存在期间在本会话过程中是不可见的, 除非它们是用模式修饰的名字引用的。 任何在临时表上创建的索引也都会自动删除。

    我们可以选择在 TEMPORARY 或 TEMP 前面放上 GLOBAL 或者 LOCAL。 这样对 PostgreSQL 没有任何区别,可以参阅 兼容性.

    table_name

    要创建的表的名字(可以用模式修饰)。

    column_name

    在新表中要创建的字段名字。

    data_type

    该字段的数据类型。它可以包括数组说明符。有关 PostgreSQL 支持的数据类型的更多信息, 请参考 Chapter 8

    DEFAULT default_expr

    DEFAULT 子句给它所出现的字段一个缺省数值。 该数值可以是任何不含变量的表达式(不允许使用子查询和对本表中的其它字段的交叉引用)。 缺省表达式的数据类型必须和字段类型匹配。

    缺省表达式将被用于任何未声明该字段数值的插入操作。 如果字段上没有缺省值,那么缺省是 NULL。

    INHERITS ( parent_table [, ... ] )

    可选的 INHERITS 子句声明一列表,这个新表自动从这列表中继承所有字段。

    使用 INHERITS 在新的子表和其父表之间创建一个永久的关系。 对父表结构的修改通常也会传播到子表,缺省时,扫描父表的时候也会扫描子表。

    如果在多于一个父表中存在同名的字段,那么就会报告一个错误,除非这些字段的数据类型在每个父表里都是匹配的。 如果没有冲突,那么重复的字段在新表中融合成一个字段。 如果新表的字段名列表中包括和继承的字段名同名的,那么它的数据类型也必须和上面一样与继承字段匹配,并且这些字段定义会融合成一个。 不过,同名的继承和新字段声明可以声明不同的约束:所有的继承过来的约束以及声明的约束都融合到一起,并且全部应用于新表。 如果新表为该字段明确的声明了一个缺省数值,那么此缺省数值覆盖任何来自继承字段声明的缺省值。 否则,任何为该字段声明了缺省数值的父表都必须声明相同的缺省,否则就会报告一个错误。

    LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ]

    LIKE 子句声明一个表,新表自动从这个表里面继承所有字段名, 他们的数据类型,以及非空约束。

    和 INHERITS 不同,新表与原来的表之间在创建动作完毕之后是完全无关的。 在源表做的任何修改都不会施加到新表中,并且也不可能在扫描源表的时候包含新表的数据。

    字段缺省表达式只有在声明了 INCLUDING DEFAULTS 之后才会包含进来。 缺省是排除缺省表达式,结果是新表中所有字段缺省都是空。

    WITH OIDS
    WITHOUT OIDS

    这个可选的子句声明新表中的行是否应该拥有赋予它们的 OID (对象标识)。 如果既没有声明 WITH OIDS 也没有声明 WITHOUT OIDS, 那么缺省值取决于配置参数 default_with_oids。 (如果新表从任何有 OID 的表继承而来,那么就算这条命令说了 WITHOUT OIDS, 也会强制 WITH OIDS。)

    如果声明或者隐含了 WITHOUT OIDS,新表就不会存储 OID,并且插入数据行的时候也不会赋予 OID。 通常认为这么做是值得的,因为这样可以减少 OID 消耗并且推迟 32 位 OID 计数器的回卷。 一旦该计数器重叠,那么就不能再假设 OID 的唯一,这样它的实用性就大打折扣。 另外,把 OID 从一个表中排除还会减少在磁盘上存储每行的空间,(在大多数机器上)每行减少 4 字节,因此也可以改进性能。

    要在一个表创建之后从中删除 OID,使用 ALTER TABLE

    CONSTRAINT constraint_name

    列或表约束的可选名字。如果没有声明,则由系统生成一个名字。

    NOT NULL

    字段不允许包含 NULL 数值。

    NULL

    该字段允许包含 NULL 数值。这是缺省。

    这个子句的存在只是为和那些非标准 SQL 数据库兼容。 我们不建议在新应用中使用它。

    UNIQUE (column constraint)
    UNIQUE ( column_name [, ... ] ) (table constraint)

    UNIQUE 声明一个规则,表示一个表里的一个或者多个字段组合的分组只能包含唯一的数值。 表的唯一约束的行为和列约束的一样,只不过多了跨多行的能力。

    对于唯一约束的用途而言,系统认为 NULL 数值是不相等的。

    每个唯一表约束都必须命名一个字段的集合,该集合必须和其它唯一约束命名字段集合或者该表定义的主键约束不同。 (否则就只是同样的约束写了两次。)

    PRIMARY KEY (column constraint)
    PRIMARY KEY ( column_name [, ... ] ) (table constraint)

    主键约束表明表中的一个或者一些字段只能包含唯一(不重复)非 NULL 的数值。 从技术上讲,PRIMARY KEY 只是 UNIQUE 和 NOT NULL 的组合,不过把一套字段标识为主键同时也体现了模式设计的元数据, 因为主键意味着其它表可以拿这套字段用做行的唯一标识。

    一个表只能声明一个主键,不管是作为字段约束还是表约束。

    主键约束应该定义在同个表上的一个与其它唯一约束所定义的不同的字段集合上。

    CHECK (expression)

    CHECK 约束声明一个生成布尔结果的子句, 一次插入或者更新操作若想成功则里面的新行或者被更新的行必须满足这个条件。 值结果为真或者未知时成功。如果有任何插入或者更新的操作生成假的结果, 那么都会抛出一个例外,而插入或更新动作不会影响数据库。 声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。

    目前,CHECK 表达式不能包含子查询也不能引用除当前行字段之外的变量。

    REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (column constraint)
    FOREIGN KEY ( column [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (table constraint)

    这些子句声明一个外键约束,外键约束要求新表中一列或者多列组成的组应该只包含匹配被引用的表 中对应引用的字段中的数值。 如果省略 refcolumn, 则使用 reftable 的主键。 被引用字段必须是被引用表中的唯一字段或者主键。

    向引用字段插入的数值将使用给出的匹配类型与被引用表中被引用列的数值进行匹配。 有三种匹配类型:MATCH FULL, MATCH PARTIAL,和 MATCH SIMPLE,它也是缺省匹配类型。 MATCH FULL 将不允许一个多字段外键的字段为 NULL,除非所有外键字段都为 NULL。 MATCH SIMPLE 允许某些外键字段为 NULL 而外键的其它部分不是 NULL。MATCH PARTIAL 还没实现。

    另外,当被参考字段中的数据改变的时候,那么将对本表的字段中的数据执行某种操作。 ON DELETE 子句声明当被参考表中的被参考行将被删除的时候要执行的操作。 类似,ON UPDATE 子句声明被参考表中被参考字段更新为新值的时候要执行的动作。 如果该行被更新,但被参考的字段实际上没有变化,那么就不会有任何动作。 除了 NO ACTION 检查之外的参考动作不能推迟,即使该约束声明为可以推迟的也如此。 下面是每个子句的可能的动作:

    NO ACTION

    生成一个错误,表明删除或者更新将产生一个违反外键约束的动作。 如果该约束是可推迟的,并且如果还存在任何引用行,那么这个错误将在检查约束的时候生成。 它是缺省动作。

    RESTRICT

    生成一个表明删除或更新将导致违反外键约束的错误。 和 NO ACTION 一样,只是动作不可推迟。

    CASCADE

    删除任何引用了被删除行的行,或者分别把引用行的字段值更新为被参考字段的新数值。

    SET NULL

    把引用行设置为 NULL。

    SET DEFAULT

    把引用字段设置为它们的缺省值。

    如果被参考字段经常更新,那么我们给外键字段增加一个索引可能是合适的, 这样与外键字段相关联的引用动作可以更有效地执行。

    DEFERRABLE
    NOT DEFERRABLE

    这两个关键字设置该约束是否可推迟。一个不可推迟的约束将在每条命令之后马上检查。 可以推迟的约束检查可以推迟到事务结尾(使用 SET CONSTRAINTS 命令)。 缺省是 NOT DEFERRABLE。目前只有外键约束接受这个子句。所有其它约束类型都是不可推迟的。

    INITIALLY IMMEDIATE
    INITIALLY DEFERRED

    如果约束是可推迟的,那么这个子句声明检查约束的缺省时间。 如果约束是 INITIALLY IMMEDIATE, 那么每条语句之后就检查它。这个是缺省。如果约束是 INITIALLY DEFERRED,那么只有在事务结尾才检查它。 约束检查的时间可以用 SET CONSTRAINTS 命令修改。

    ON COMMIT

    我们可以用 ON COMMIT 控制临时表在事务块结尾的行为。这三个选项是:

    PRESERVE ROWS

    在事务结尾不发生任何特定的动作。这是缺省行为。

    DELETE ROWS

    临时表的所有行在每次事务结尾都被删除。实际上,在每次提交的时候都自动 TRUNCATE 。

    DROP

    在当前事务块的结尾,临时表将被删除。

    TABLESPACE tablespace

    tablespace 是新表将要创建所在的表空间。 如果没有声明,将使用 default_tablespace,如果 default_tablespace 是空,那么将使用数据库的缺省表空间。

    USING INDEX TABLESPACE tablespace

    这个子句允许选择与一个 UNIQUE 或者 PRIMARY KEY 约束相关的所以创建时所在的表空间。 如果没有提供这个子句,这个索引将在该表的同一个表空间中创建。

    注意

    我们不建议在新应用中使用 OID,可能情况下,更好的选择是使用一个 SERIAL 或者其它序列发生器做表的主键。 如果一个应用使用了 OID 标识表中的特定行,那么我们建议在该表的 oid 字段上创建一个唯一约束,以确保该表的 OID 即使在计数器重叠之后也是唯一的。如果你需要一个整个数据库范围的唯一标识, 那么就要避免假设 OID 是跨表唯一的,你可以用 tableoid 和行 OID 的组合来实现这个目的。

    提示: 对那些没有主键的表,我们不建议使用 WITHOUT OIDS, 因为如果既没有 OID 又没有唯一数据键字,那么就很难标识特定的行。

    PostgreSQL 自动为每个唯一约束和主键约束创建一个索引以确保唯一性。 因此,我们不必为主键字段明确的创建索引。 (参阅 CREATE INDEX 获取更多信息。)

    唯一约束和主键在目前的实现里是不能继承的。 这样,如果把继承和唯一约束组合在一起会导致无法运转。

    一个表不能超过 1600 个字段。(实际上,实际的限制比这个更低, 因为还有远祖长度限制。)

    例子

    创建表 films 和 distributors

    CREATE TABLE films (
        code        char(5) CONSTRAINT firstkey PRIMARY KEY,
        title       varchar(40) NOT NULL,
        did         integer NOT NULL,
        date_prod   date,
        kind        varchar(10),
        len         interval hour to minute
    );

    CREATE TABLE distributors (
         did    integer PRIMARY KEY DEFAULT nextval('serial'),
         name   varchar(40) NOT NULL CHECK (name <> '')
    );

    创建一个带有 2 维数组的表:

    CREATE TABLE array_int (
        vector  INT[][]
    );

    为表 films 定义一个唯一表约束。 唯一表约束可以在表的一个或多个字段上定义:

    CREATE TABLE films (
        code        char(5),
        title       varchar(40),
        did         decimal(3),
        date_prod   date,
        kind        varchar(10),
        len         interval hour to minute,
        CONSTRAINT production UNIQUE(date_prod)
    );

    定义一个检查列约束:

    CREATE TABLE distributors (
        did     integer CHECK (did > 100),
        name    varchar(40)
    );

    定义一个检查表约束:

    CREATE TABLE distributors (
        did     integer,
        name    varchar(40)
        CONSTRAINT con1 CHECK (did > 100 AND name <> '')
    );

    为表 films 定义一个主键表约束。 主键表约束可以定义在表上的一个或多个字段。

    CREATE TABLE films (
        code        char(5),
        title       varchar(40),
        did         integer,
        date_prod   date,
        kind        varchar(10),
        len         interval hour to minute,
        CONSTRAINT code_title PRIMARY KEY(code,title)
    );

    为表 distributors 定义一个主键约束。 下面两个例子是等效的,第一个例子使用了表约束语法, 第二个使用了列约束语法。

    CREATE TABLE distributors (
        did     integer,
        name    varchar(40),
        PRIMARY KEY(did)
    );

    CREATE TABLE distributors (
        did     integer PRIMARY KEY,
        name    varchar(40)
    );

    下面这个例子给字段 name 赋予了一个文本常量缺省值, 并且将字段 did 的缺省值安排为通过选择序列对象的下一个值生成。 modtime 的缺省值将是该行插入的时候的时间。

    CREATE TABLE distributors (
        name      varchar(40) DEFAULT 'Luso Films',
        did       integer DEFAULT nextval('distributors_serial'),
        modtime   timestamp DEFAULT current_timestamp
    );

    在表 distributors 上定义两个 NOT NULL 列约束,其中之一明确给出了名字:

    CREATE TABLE distributors (
        did     integer CONSTRAINT no_null NOT NULL,
        name    varchar(40) NOT NULL
    );

    为 name 字段定义一个唯一约束:

    CREATE TABLE distributors (
        did     integer,
        name    varchar(40) UNIQUE
    );

    上面的和下面这样作为一个表约束声明是一样的:

    CREATE TABLE distributors (
        did     integer,
        name    varchar(40),
        UNIQUE(name)
    );

    在表空间 diskvol1 里创建表 cinemas

    CREATE TABLE cinemas (
            id serial,
            name text,
            location text
    ) TABLESPACE diskvol1;

    兼容性

    CREATE TABLE 遵循 SQL-92 和 SQL:1999 的一个子集,一些例外情况在下面列出。

    临时表

    尽管 CREATE TEMPORARY TABLE 的语法和 SQL 标准的类似, 但是效果是不同的。在标准里,临时表只是定义一次并且自动存在(从空内容开始)于任何需要它们的会话中。 PostgreSQL 要求每个会话为它们使用的每个临时表发出它们自己的 CREATE TEMPORARY TABLE 命令。 这样就允许不同的会话将相同的临时表名字用于不同的目的,而标准的实现方法则把一个临时表名字约束为具有相同的表结构。

    标准定义的临时表的行为被广泛地忽略了。PostgreSQL 在这方面上的行为类似于许多其它 SQL 数据库

    标准中在全局和局部地临时表之间的区别在 PostgreSQL 里不存在,因为这种区别取决于模块的概念,而 PostgreSQL 没有这个概念。出于兼容考虑, PostgreSQL 将接受临时表声明中的 GLOBAL 和 LOCAL 关键字, 但是他们没有作用。

    临时表的 ON COMMIT 子句也类似于 SQL 标准, 但是有些区别。如果忽略了 ON COMMIT 子句,SQL 声明缺省的行为是 ON COMMIT DELETE ROWS。 但是 PostgreSQL 里的缺省行为是 ON COMMIT PRESERVE ROWS。 在 SQL 里不存在 ON COMMIT DROP

    字段检查约束

    SQL 标准说 CHECK 字段约束只能引用他们施用的字段; 只有 CHECK 表约束才能引用多个字段。PostgreSQL 并不强制这个限制;它把字段和表约束看作相同的东西。

    NULL "约束"

    NULL "约束"(实际上不是约束)是 PostgreSQL 对 SQL 标准的扩展, 包括它是为了和其它一些数据库系统兼容(以及为了和 NOT NULL 约束对称)。 因为它是任何字段的缺省,所以它的出现只是噪音而已。

    继承

    通过 INHERITS 子句的多重继承是 PostgreSQL 语言的扩展。 SQL:1999(但不包括 SQL-92)使用不同的语法和语义定义了单继承。 SQL:1999 风格的继承还没有在 PostgreSQL 中实现。

    对象 ID

    PostgreSQL 的 OID 的概念不是标准。

    零行表

    PostgreSQL 允许创建没有字段的表 (比如,CREATE TABLE foo();)。这是对 SQL 标准的扩展, 标准不允许存在零字段表。零字段表本身没什么用,但是禁止他们会给 ALTER TABLE DROP COLUMN带来很奇怪的情况,所以,这个时候忽视标准的限制概念非常清楚。

    表空间

    PostgreSQL 的表空间概念不是标准的东西。 因此 TABLESPACE 和 USING INDEX TABLESPACE 都是扩展。

    展开全文
  • 如何利用FastReport创建交叉报表?

    千次阅读 2014-12-11 13:24:29
    ...要创建交叉报表,我们需要使用到FastReport “DEMOS\MAIN” 文件夹中的“crosstest”。“crosstest”包含几下几种类型的数据:   在Delphi中创建一个新项目,将“TTable”,
  • mysql多表查询创建视图

    万次阅读 2018-06-26 20:12:48
    1.union联合查询 将多个select语句的结果纵向组合 select * from stuinfo union select * from stuinfoo; union: 1.all #显示全部记录 2.distinct #(去除重复的值 他是默认) select * from stuinfo union all...
  • 如何生成交叉表

    千次阅读 2005-03-23 10:20:00
    http://blog.csdn.net/demongz/archive/2005/03/22/327169.aspx在关系数据库中,经常为了使数据库更符合第三范式,同时也是从数据存取速度和空间...但是体现给最终用户是要求能直观的报表形式,所以,就要用到交叉表
  • iReport专题学习之数据源 09

    千次阅读 2014-04-10 21:42:26
    选择"DataSource JDBC Connection"点击"Next",在出现的窗口中输入数据源的名称以及Driver、URL、username、password等相关信息,如下图-4所示: 图 -4 点击”test“按钮,对JDBC连接做测试,如下图-5所示...
  • 何云辉 CSDN 文章目录1.内连接2.外连接(1)左外连接(`left outer join`)。...连接是关系型数据库中常用的多表查询数据的模式,连接可以根据各个之间的逻辑关系来利用一个中的数据选择另外的中的...
  • 首先,对不同领域内的数据源构建相应本体库,并将不同本体库通过数据融合映射到全局本体库,然后,利用实体对齐和实体链接方法进行知识获取和融合,最后,搭建知识图谱应用平台,提供查询和统计等操作。在实体对齐...
  • 在 ActiveReports 中可以通过矩阵控件非常方便的实现交叉报表,同时还可以设置数据的分组、排序、过滤、小计、合计等操作,可以满足您报表的智能数据分析等需求。在矩阵控件中组的行数和列数由每个行分组和列分组中...
  • 然而,FROM子句也可合并多个数据源和多种数据源的数据。单个SQL SELECT语句中可访问的的最大数量是256个。 FROM子句是SQL语句其余部分的基础。要把一个列放在输出中,或在WHERE条件下访问,或放在ORDER BY中,...
  • 编号性别家庭地区月生活费月衣物支出买衣服因素1男大城市800200价格2女小城市600180品牌3男中城市500110样式4男小城市900140价格5女中城市500200样式6男大城市600360品牌7女大城市...:数据源的首行必须有列标题...
  •  在程序中用Describe()函数得到某个已经存在的数据窗口对象的代码。如: string str_dwsyntax,str_lag //获得数据窗口1的语法 str_dwsyntax=dw_1.object.datawindow.syntax //根据数据窗口1的语法动
  • 第八章 BIRT交叉报表

    万次阅读 2013-01-08 17:27:02
    8.1 创建交叉报表和统计 一、创建报表和配置数据源 新建一个报表,改好自己的名字,然后next进行下一步。 选择一个空白报表(Blank Report),单击finish完成。 新建数据源,这里使用的是协同...
  • pgsql查询--表达式

    千次阅读 2014-06-05 11:08:11
    查询 Fast Forward Next 7.2. 表达式 表达式计算一个。 该表达式包含一个FROM子句,该子句可以根据需要选用WHERE,GROUP BY, 和HAVING 子句。大部分的表达式只是指向磁盘上的一个...
  • Power BI数据建模

    万次阅读 2018-07-04 09:07:26
    数据源之间的关系使 Power BI 能够了解之间的关系,以便能创建有趣的视觉对象和报表。 本部分对关系作出了解释,甚至还说明了如何在不存在任何关系的情况下创建关系。 l 如何管理数据关系 Power BI 允许...
  • 套接字socket 的地址族和类型、工作原理、创建过程

    千次阅读 多人点赞 2013-09-17 10:21:45
    注:本分类下文章大多整理自《深入分析linux内核代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入...
  • 数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum 分页,视图,序列,索引
  • 数据库连接查询类型(左连接、右连接、全连接、内连接和交叉连接) 在关系数据库管理系统中,建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个中。当检索数据时,通过连接操作查询出存放在多...
  • 数据分析业务调研

    千次阅读 2014-09-04 21:58:26
    北京宇动科技有限公司http://www.cosmosource.com公司介绍:北京宇动科技有限公司成立于2002年,是由一批有志于中国软件业发展的归国...宇动专注于数据仓库、数据分析和数据挖掘领域的研究,致力于将国外先进的
  • SQL应用与开发:(五)多个数据表的连接

    千次阅读 热门讨论 2015-04-04 11:58:19
    数据库中的各个中存储着不同的数据,用户往往需要用多个中的数据来组合、提炼出所需要的信息。...通常总是通过连接创建一个新,以包含不同中的数据。如果新有合适的域,就可以将它连接到现有的
  • 精通SQL--结构化查询语言详解

    千次下载 热门讨论 2011-12-11 16:35:41
    11.4 从外部数据源导入、导出数据 222 11.4.1 access数据库数据的导出 223 11.4.2 access数据库数据的导入 225 11.4.3 sql server数据库数据导出 227 11.4.4 sql server数据库数据导入 230 第12章 数据的更新和...
  • 数据查询(2)-高级查询

    千次阅读 2008-11-18 16:53:00
    • 基本条件查询比较运算符:>,>=,between a and b,in(a,b,c),not exists,is null,like ‘%_’,or,and, any,all等• 把某一字段中内容在特定范围内的记录查询出来SELECT StudentID, Score FROM SCore WHERE Score ...
  • PostgreSQL 9.4文档 第7章 查询

    千次阅读 2015-02-06 22:01:27
    上一章介绍了如何创建表,如何填充数据,如何操作数据。本章我们将要讨论如何检索数据库中的数据。 7.1. 概述   检索数据的过程或者命令称为查询。在SQL中SELECT命令用于指定查询。SELECT命令的一般语法如下:...
  • ORACLE错误一览,方便大家查询

    千次阅读 2013-03-05 11:23:11
    ORACLE错误一览,方便大家查询! ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-...
  • 数据仓库方案选型

    万次阅读 2017-11-07 10:43:20
    底层的数据仓库服务器通常是一个关系数据库系统(各种关联的sql统计会更方便一些,非关系型数据库目前在这方面还是有所区别)。 中间层OLAP服务器,典型实现为ROLAP模型或MOLAP模型。 顶层为前端客户端,用于数据...
  •  首先第一步,按上述方式创建数据源,并导入查询属性(字段)到fields中。  第二步从组件面板中拖拽crosstab到summary栏,注意必须是summary栏。在制作交叉报表的时候column header、column footer 、detail栏...
  • ORACLE错误一览,方便查询

    千次阅读 2013-11-27 19:44:59
    ORA-06000: NETASY: 端口打开失败 ORA-06001: NETASY: 端口...ORA-06559: 请求的数据类型 错误,实际数据类型为 ORA-06560: pos 为负或大于缓冲区大小 ORA-06561: 程序包 DBMS_SQL 不支持给定的语句 ORA-06562:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,159
精华内容 11,663
关键字:

创建交叉表查询的数据源