2017-11-16 17 views
1

2つのテーブルがあります。両方のテーブルにmysqlで値が0より大きい列と値を選択

Name: `table1` 
name d1  d2  d3  d4  d5 
Tapan 2  0  3  8  0 
another table : `table2` 
name c1  c2  c3  c4  c5  c6 
Tapan 12  14  0  0  17  0 

50+列があります。私は、値> 0と名= 'Tapan'

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

See the SQL Fiddle

は私がする必要があるレポートのSQLクエリの作成に失敗しました

name - Tapan 
d1  - 2 
d3  - 3 
d4  - 8 
c1  - 12 
c2  - 14 
c5  - 17 
total - 56 

:のようなレポートを取得する方法 列の値が0より大きいレポートを取得する

+1

ヒント:すべての組合を使用しています。 –

+0

このような50列以上のテーブルがある場合は、列を別々の行にするように再設計する方がよいでしょう。 – Barmar

+0

動的情報は常に列の値であり、表または列の名前ではありません。 – Barmar

答えて

0

これらは固定列であり、name = Tapanのみのレポートが必要な場合鶏あなたは

C1、C2、D1のようなデータ型のデータのために1つずつの2つのテーブルを作成して再構築するために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

Editを使用して、所望の結果を得ることができますなど

data_type

TYPE_IDとtype_valueは、それぞれの名前とタイプに関連した番号を保存すると、あなたは、単純な結合操作を使用して、必要なデータを照会することができるよう
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 

データテーブルは、タイプのテーブルの参照を保持します

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?はい、問題があり、将来的にも増加します。あなたの構造を再設計することを考える必要があると思います。 これは、答えの始めに私が言及している理由です*これらは固定番号です。列の* –

+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 

また、のような、両方のテーブル組み合わせることができ:その後、クエリである

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 
関連する問題