在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