如何获得具有所需输出的数据透视类型

时间:2018-08-23 07:21:15

标签: mysql mariadb

嗨,我是这个MySQL的新手,正在努力查询数据透视型数据。

我正在创建学生管理系统。在“费用”模块中,我将一张一张地存储费用条目。要收取费用,我们在条目中有“级别”,“月”和“金额”。因此,我需要将此作为每月的明智报告。详细信息如下。

费用清单表:

   CREATE TABLE fees_inventory ( fees_inventory_id INT(11) NOT NULL AUTO_INCREMENT, 
                                 fees_id INT(11) NULL DEFAULT NULL, 
                                 student_id INT(11) NOT NULL, 
                                 programme_id INT(11) NOT NULL, 
                                 fees_level INT(11) NOT NULL, 
                                 level_month VARCHAR(10) NOT NULL COLLATE 'utf8mb4_unicode_ci', 
                                 fees_amount INT(11) NOT NULL, 
                                 fees_type VARCHAR(50) NOT NULL COLLATE 'utf8mb4_unicode_ci', 
                                 fees_month VARCHAR(15) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', 
                                 payable_date DATE NULL DEFAULT NULL, 
                                 fees_date DATE NULL DEFAULT NULL, 
                                 fees_year YEAR NULL DEFAULT NULL, 
                                 PRIMARY KEY (fees_inventory_id), 
                                 UNIQUE INDEX Index 5 (student_id, fees_year, fees_month, fees_type, programme_id), 
                                 INDEX FK_fees_inventory_programme_master (programme_id), 
                                 INDEX FK_fees_inventory_fees_master (fees_id), 
                                 CONSTRAINT FK_fees_inventory_fees_master FOREIGN KEY (fees_id) REFERENCES fees_master (fees_id), 
                                 CONSTRAINT FK_fees_inventory_programme_master FOREIGN KEY (programme_id) REFERENCES programme_master (programme_id), 
                                 CONSTRAINT FK_fees_inventory_student_master FOREIGN KEY (student_id) REFERENCES student_master (student_id) ) 
                                 COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=350 ;

插入脚本:

INSERT INTO fees_inventory (fees_inventory_id, fees_id, student_id, programme_id, fees_level, level_month, fees_amount, fees_type, fees_month, payable_date, fees_date, fees_year)
 VALUES
 (30, NULL, 165, 111, 8, '1', 750, 'Term', 'June', '2018-06-01', '2018-06-10', '2018'),
 (31, NULL, 165, 111, 8, '2', 750, 'Term', 'July', '2018-07-01', '2018-07-01', '2018'),
 (32, NULL, 165, 111, 8, '3', 750, 'Term', 'August', '2018-08-01', '2018-08-05', '2018'), (33, NULL, 150, 111, 4, '3', 750, 'Term', 'June', '2018-06-01', '2018-06-10', '2018'), (34, NULL, 150, 111, 4, '3E', 750, 'Term', 'July', '2018-07-01', '2018-07-01', '2018'), (35, NULL, 150, 111, 5, '1', 750, 'Term', 'August', '2018-08-01', '2018-08-05', '2018'), (36, NULL, 70, 113, 2, '4', 750, 'Term', 'June', '2018-06-01', '2018-06-16', '2018'), (37, NULL, 70, 113, 3, '1', 750, 'Term', 'July', '2018-07-01', '2018-07-18', '2018'), (38, NULL, 173, 111, 2, '1', 750, 'Term', 'June', '2018-06-01', '2018-07-01', '2018'), (39, NULL, 173, 111, 2, '2', 750, 'Term', 'July', '2018-07-01', '2018-07-01', '2018'),
 (40, NULL, 198, 111, 7, '1', 750, 'Term', 'June', '2018-06-01', '2018-06-10', '2018'), (41, NULL, 198, 111, 7, '2', 750, 'Term', 'July', '2018-07-01', '2018-07-01', '2018'), (42, NULL, 198, 111, 7, '3', 750, 'Term', 'August', '2018-08-01', '2018-08-05', '2018'), (43, NULL, 67, 131, 1, '1', 850, 'Term', 'June', '2018-06-01', '2018-06-09', '2018'), (44, NULL, 67, 131, 1, '2', 850, 'Term', 'July', '2018-07-01', '2018-07-14', '2018'), (45, NULL, 184, 111, 4, '2', 750, 'Term', 'June', '2018-06-01', '2018-06-10', '2018'), (46, NULL, 184, 111, 4, '3', 750, 'Term', 'July', '2018-07-01', '2018-07-15', '2018'), (47, NULL, 184, 111, 5, '1', 750, 'Term', 'August', '2018-08-01', '2018-08-05', '2018'), (48, NULL, 58, 111, 8, '3E', 750, 'Term', 'June', '2018-06-01', '2018-06-05', '2018'), (49, NULL, 58, 111, 9, '1', 750, 'Term', 'July', '2018-07-01', '2018-07-13', '2018'), (50, NULL, 118, 111, 4, '2', 750, 'Term', 'June', '2018-06-01', '2018-06-11', '2018'), (51, NULL, 118, 111, 4, '3', 750, 'Term', 'July', '2018-07-01', '2018-07-05', '2018'),
 (52, NULL, 77, 113, 3, '3', 750, 'Term', 'June', '2018-06-01', '2018-06-09', '2018'), (53, NULL, 77, 113, 3, '4', 750, 'Term', 'July', '2018-07-01', '2018-07-07', '2018'), (54, NULL, 77, 113, 4, '1', 750, 'Term', 'August', '2018-08-01', '2018-08-11', '2018'), (55, NULL, 86, 113, 2, '1', 750, 'Term', 'June', '2018-06-01', '2018-06-09', '2018'), (56, NULL, 86, 113, 2, '2', 750, 'Term', 'July', '2018-07-01', '2018-07-06', '2018'), (57, NULL, 86, 113, 2, '3', 750, 'Term', 'August', '2018-08-01', '2018-08-04', '2018'), (58, NULL, 102, 111, 1, '1', 850, 'Term', 'July', '2018-07-01', '2018-07-07', '2018'), (59, NULL, 102, 111, 1, '2', 850, 'Term', 'August', '2018-08-01', '2018-08-09', '2018'), (60, NULL, 146, 111, 3, '1', 750, 'Term', 'June', '2018-06-01', '2018-07-07', '2018'), (61, NULL, 185, 111, 4, '2', 750, 'Term', 'June', '2018-06-01', '2018-06-07', '2018'), (62, NULL, 185, 111, 4, '3', 750, 'Term', 'July', '2018-07-01', '2018-07-05', '2018'), (63, NULL, 185, 111, 5, '1', 750, 'Term', 'August', '2018-08-01', '2018-08-05', '2018'),
 (64, NULL, 174, 111, 2, '1', 750, 'Term', 'June', '2018-06-01', '2018-07-01', '2018'), (65, NULL, 174, 111, 2, '2', 750, 'Term', 'July', '2018-07-01', '2018-07-01', '2018'), (66, NULL, 175, 111, 2, '1', 750, 'Term', 'June', '2018-06-01', '2018-07-01', '2018'), (243, NULL, 191, 111, 4, '3E', 750, 'Term', 'August', '2018-08-01', '2018-08-17', '2018');

我创建的用于获取数据的查询:

SELECT sm.student_id, sm.student_name, spm.`status`, 
CONCAT(
    CAST(SUM(if(fi.payable_date = '2018-6-01', fi.fees_amount, null)) as CHAR(50)),'_',
    CAST(fi.fees_level as CHAR(50)),'_',CAST(fi.level_month as CHAR(50))) as `June`,
CONCAT(
    CAST(SUM(if(fi.payable_date = '2018-7-01', fi.fees_amount, null)) as CHAR(50)),'_',
    CAST(fi.fees_level as CHAR(50)),'_',CAST(fi.level_month as CHAR(50))) as `July`,
CONCAT(CAST(SUM(if(fi.payable_date = '2018-8-01', fi.fees_amount, null)) as CHAR(50)),'_',
    CAST(fi.fees_level as CHAR(50)),'_',
    CAST(fi.level_month as CHAR(50))) as `August`
 from student_master sm
 inner join student_programme_mapping spm
         on spm.student_id=sm.student_id
        and spm.programme_id in (111,113,131)
 left join fees_inventory fi
        on fi.student_id=sm.student_id
       and fi.programme_id=spm.programme_id
       and fi.fees_type='Term'
 group by sm.student_id

注意:fi.fees_levelfi.level_month在所有列中都重复。请帮助我获取每个费用条目的级别和月份。

0 个答案:

没有答案