我在mysql有一张下面的桌子。
CREATE TABLE `mdc_tariff_slabs` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
`type` varchar(50) DEFAULT NULL,
`slab_name` varchar(50) NOT NULL COMMENT 'Name of the Slab',
`slab_start` int(50) NOT NULL COMMENT 'Start of the slab',
`slab_end` int(50) DEFAULT NULL COMMENT 'End of the slab',
`rate` varchar(50) NOT NULL COMMENT 'Rate of slab',
`t_id` int(11) NOT NULL COMMENT 'Tariff ID, Foriegn Key',
PRIMARY KEY (`id`),
KEY `T_ID` (`t_id`),
CONSTRAINT `T_ID` FOREIGN KEY (`t_id`) REFERENCES `mdc_tariff` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=latin1;
/*Data for the table `mdc_tariff_slabs` */
insert into `mdc_tariff_slabs`(`id`,`type`,`slab_name`,`slab_start`,`slab_end`,`rate`,`t_id`) values (1,NULL,'S-1',1,100,'10',1),(2,NULL,'S-2',101,150,'12',1),(3,NULL,'S-3',151,NULL,'14',1),(4,NULL,'S-1',1,50,'5',2),(5,NULL,'S-2',51,100,'7',2),(6,NULL,'S-3',101,NULL,'8',2),(52,'WAPDA','S-1',1,100,'12',12),(53,'WAPDA','S-2',101,150,'14',12),(54,'WAPDA','S-3',151,NULL,'16',12),(58,'Generator','S-1',1,100,'17',12),(59,'Generator','S-2',101,150,'20',12),(60,'Generator','S-3',151,NULL,'22',12);在我的SQL Fiddle里也是一样
我有板子范围。在特定type的范围内,我想检查rate。假设要检查的值是40,而type是Generator。因此,如果该值在1-100范围内,则速率为17,反之亦然。
预期输出
type |value|rate|
======================
Generator| 40 |17 |
....我怎样才能做到这一点?
任何帮助都将不胜感激。
发布于 2020-09-11 12:44:40
看起来板坯可能会重叠,所以您应该选择板条值的MAX,以确保您正在处理不良数据。这很棘手,因为rate被定义为varchar。这就是为什么在求和之前,我要把它转换成一个int值。你可能对此仍有异议。我建议使用该列的int值。
看起来,slab_end也可以是NULL,表示没完没了,所以简单的BETWEEN条件不会适用于您的情况。我用一个OR条件来处理它。
我会这样做:
SET @value = 40;
SET @type = 'Generator';
SELECT @type AS type,
@value AS value,
MAX(CAST(rate AS UNSIGNED)) AS rate
FROM mdc_tariff_slabs
WHERE type = @type
AND @value >= slab_start
AND (@value <= slab_end OR slab_end IS NULL);https://stackoverflow.com/questions/63847256
复制相似问题