在mysql中选择值大于0的列和值
我有两张桌子在mysql中选择值大于0的列和值,mysql,Mysql,我有两张桌子 Name: `table1` name d1 d2 d3 d4 d5 Tapan 2 0 3 8 0 两个表中都有50多列。 如何获得以下报告: name - Tapan d1 - 2 d3 - 3 d4 - 8 c1 - 12 c2 - 14 c5 - 17 total - 56 我无法为值>0且名称='Tap
Name: `table1`
name d1 d2 d3 d4 d5
Tapan 2 0 3 8 0
两个表中都有50多列。
如何获得以下报告:
name - Tapan
d1 - 2
d3 - 3
d4 - 8
c1 - 12
c2 - 14
c5 - 17
total - 56
我无法为值>0且名称='Tapan'的报表创建sql查询
SELECT a.*, b.*
FROM table1 a
INNER JOIN table2 b
ON a.name = b.name
我需要获取列值大于
0
的报告,如果这些列是固定列,并且您只需要name=Tapan的报告,那么您可以使用union all
select a.name , a.tapan
from(
select 'd1' as name, d1 as tapan from table1 where name = 'Tapan'
union all
select 'd2' as name, d2 as tapan from table1 where name = 'Tapan'
union all
select 'd3' as name, d3 as tapan from table1 where name = 'Tapan'
union all
select 'd4' as name, d4 as tapan from table1 where name = 'Tapan'
union all
select 'd5' as name, d5 as tapan from table1 where name = 'Tapan'
union all
select 'c1' as name, c1 as tapan from table2 where name = 'Tapan'
union all
select 'c2' as name, c2 as tapan from table2 where name = 'Tapan'
union all
select 'c3' as name, c3 as tapan from table2 where name = 'Tapan'
union all
select 'c4' as name, c4 as tapan from table2 where name = 'Tapan'
union all
select 'c5' as name, c5 as tapan from table2 where name = 'Tapan'
union all
select 'c6' as name, c6 as tapan from table2 where name = 'Tapan'
) a
where a.tapan > 0
union all
select 'total', sum(a.d1 +a.d2 +a.d3 +a.d4 +a.d5 + b.c1 + b.c2 + b.c3 + b.c4 + b.c5 + b.c6 )
from table1 a inner join table2 b on a.name = b.name where a.name = 'Tapan'
为重组而编辑
创建两个表,一个用于数据,另一个用于c1、c2、d1等数据类型,如
数据类型
id title
------ --------
1 d1
2 d2
3 d3
4 d4
5 d5
6 c1
7 c2
8 c3
9 c4
10 c5
11 c6
数据表
id name type_id type_value
------ ------ ------- ------------
1 Tapan 1 2
2 Tapan 2 0
3 Tapan 3 3
4 Tapan 4 8
5 Tapan 5 0
6 Tapan 6 12
7 Tapan 7 14
8 Tapan 8 0
9 Tapan 9 0
10 Tapan 10 17
11 Tapan 11 0
数据表将保存类型表的引用作为类型\ id,类型\值将存储与每个名称和类型相关的编号,然后您可以使用简单的联接操作查询所需的数据
SELECT b.`title`,a.`type_value` AS Tapan
FROM `data` a
JOIN `data_types` b ON a.`type_id` = b.`id`
WHERE a.`name` = 'Tapan'
AND a.`type_value` > 0
Jusr尝试一下,它会起作用,但也可以做得更好。我希望这会有所帮助。如果您将表重新设计为这样会更好:
SELECT CONCAT('d', Dnum) AS name, Dval AS Tapan
FROM table1
WHERE Name = 'Tapan' AND Dval > 0
UNION ALL
SELECT CONCAT('c', Cnum) AS name, Cval AS Tapan
FROM table2
WHERE Name = 'Tapan' AND Cval > 0
表1
:
Name Dnum Dval
Tapan 1 2
Tapan 2 0
Tapan 3 3
Tapan 4 8
Tapan 5 0
表2
:
Name Cnum Cval
Tapan 1 12
Tapan 2 14
Tapan 3 0
Tapan 4 0
Tapan 5 17
Tapan 6 0
然后您可以这样查询:
SELECT CONCAT('d', Dnum) AS name, Dval AS Tapan
FROM table1
WHERE Name = 'Tapan' AND Dval > 0
UNION ALL
SELECT CONCAT('c', Cnum) AS name, Cval AS Tapan
FROM table2
WHERE Name = 'Tapan' AND Cval > 0
您还可以将两个表组合在一起,如:
Name Prefix Num Val
Tapan d 1 2
Tapan d 2 0
Tapan d 3 3
Tapan d 4 8
Tapan d 5 0
Tapan c 1 12
Tapan c 2 14
Tapan c 3 0
Tapan c 4 0
Tapan c 5 17
Tapan c 6 0
那么查询是:
SELECT CONCAT(prefix, num) AS name, val AS Tapan
FROM yourTable
WHERE name = 'Tapan' AND val > 0
提示:使用union all。如果您的表有50多列,则最好重新设计,使列成为单独的行。动态信息应始终以列值而不是表或列名的形式显示。感谢您给出宝贵的答案。实际上有100多个列,那么查询就太长了。长查询是否有问题?@dipakdutta 100+列?是的,可能会有问题,而且将来还会增加,我想你们需要考虑重新设计你们的结构。这就是为什么我在回答的开头提到,如果这些是固定的列数,我会改变报告结构,比如名称| d1 | d3 | d4 | c1 | c2 | c5吗?那么如何报告呢?请告诉我,如果你想让我建议表格结构,我可以更新我的帖子。非常感谢。我将实施你的建议。上述查询不起作用。请检查小提琴
SELECT CONCAT(prefix, num) AS name, val AS Tapan
FROM yourTable
WHERE name = 'Tapan' AND val > 0