2017-11-16 1 views
1

두 개의 테이블이 있습니다. 두 테이블에서 mysql에서 값이 0보다 큰 열과 값을 선택하십시오.

another table : `table2` 
name c1  c2  c3  c4  c5  c6 
Tapan 12  14  0  0  17  0 

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'

SELECT a.*, b.* 
FROM table1 a 
INNER JOIN table2 b 
ON a.name = b.name 

See the SQL Fiddle

I가 필요로하는 보고서에 대한 SQL 쿼리를 작성하는 데 실패 열 값이 0보다 큰 보고서 가져 오기 0

+1

힌트 : 사용 조합을 모두. –

+0

이와 같은 50 개 이상의 열이있는 테이블이있는 경우 열을 별도의 행이되도록 다시 디자인하는 것이 좋습니다. – Barmar

+0

동적 정보는 항상 테이블 또는 열 이름이 아닌 열 값이어야합니다. – Barmar

답변

0

이들은 고정 열이고 이름 = Tapan 만 해당 보고서가 필요한 경우 t 암탉 당신은

C1, C2, D1과 같은 데이터 유형에 대한 데이터에 대해 하나 하나를이 개 테이블을 작성 구조 조정에 대한 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' 

Demo

편집을 사용하여 원하는 결과를 얻을 수 있습니다 등등

data_type

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 

데이터 테이블 TYPE_ID 같은 유형의 테이블의 참조를 보유하고 type_value은 번호가 각각 이름과 유형에 관한 저장하고 당신은 간단한 가입 작업을 사용하여 필요한 데이터를 조회 할 수 있습니다

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 

Demo

+0

귀중한 답변을 주셔서 감사합니다. 실제로 100 개 이상의 열이 있습니다. 그러면 쿼리가 너무 길어집니다. 긴 쿼리에 문제가 있습니까? –

+0

@dipakdutta 100+ columns? 예, 문제가있을 수 있으며 향후에도 증가 할 것입니다. 구조 재 설계에 대해 생각해 볼 필요가 있습니다. 그 이유는 대답의 시작에 내가 언급 한 * 이들은 고정 번호입니다. of columns * –

+0

의미는 다음과 같습니다. 이름과 같은보고 구조를 변경합니까? d1 | d3 | d4 | c1 | c2 | C5? 어떻게 신고할까요? Plz ... –

0
SELECT a.*, b.* 
FROM table1 a 
INNER JOIN table2 b 
ON (a.name = b.name AND (a.d1>0 AND a.d2>0 AND a.d3>0 AND a.d4>0 AND a.d5>0) AND (b.c1>0 AND b.c2>0 AND b.c3>0 AND b.c4>0 AND b.c5>0)) 

Jusr이 시도, 작동하지만 더 잘 만들 수 있습니다. 이게 도움이 되길 바란다.

+0

위의 쿼리가 작동하지 않습니다. Plz는 피들 체크 http://sqlfiddle.com/#!9/418248/37 –

1

이처럼 당신의 테이블을 재 설계하는 경우 그것은 더 나은 것 :

table1 :

Name Dnum Dval 
Tapan 1  2 
Tapan 2  0 
Tapan 3  3 
Tapan 4  8 
Tapan 5  0 

table2 :

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 
,451,515,

당신은 또한 같은 두 테이블을 결합 할 수 있습니다 :

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 
관련 문제