选择item1,item2 .... item10作为一列,其中items值大于0

时间:2017-06-13 19:13:18

标签: mysql

如何选择item1, item2.... item10作为一列,其中项的值大于0?

原始数据

Id  Party   Item_1  Item_2  Item_3  Item_4
1       A   0       500     0        0
2       B   300     0       0        0
3       A   500     0       0        0
4       C   0       0      500       0
5       D   0       300    0         0
6       A   0       0      0        400
7       B   0       0      200      0

我想要这种格式

PARTY   ITEM    VALUES
A       Item_2  500
B       Item_1  300
A       Item_1  500
C       Item_3  500
D       Item_2  300
A       Item_4  400
B       Item_3  200

3 个答案:

答案 0 :(得分:0)

使用union all取消数据,并单独选择每列,然后限制项目。

SELECT * FROM (
  SELECT #, party, 'item_1' as Item, item as value
  FROM Table 

  UNION ALL
  SELECT #, party, 'item_2' as Item, item as value
  FROM Table 

  UNION ALL
  SELECT #, party, 'item_3' as Item, item as value
  FROM Table 

  UNION ALL
  SELECT #, party, 'item_4' as Item, item as value
  FROM Table 
  ...
 )
WHERE ITEM > 0

或者,如果我们假设每行只有1列不为零.. 我们可以判断项目编号,然后通过coalese来获取项目(或者如果需要可以再次使用案例)

SELECT #, case when item_1 <> 0 then 'item_1'
            when item_2 <> 0 then 'item_2' 
            when item_3 <> 0 then 'item_3' 
            when item_4 <> 0 then 'item_4' 
            .... end as item,
          coalesce(item_1, Item_2, Item_3, Item_4,...)
 FROM Table

答案 1 :(得分:0)

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(party   CHAR(1) NOT NULL
,Item_1  INT NOT NULL
,Item_2  INT NOT NULL
,Item_3  INT NOT NULL
,Item_4  INT NOT NULL
);

INSERT INTO my_table VALUES
('A',0,500,0,0),
('B',300,0,0,0),
('A',500,0  , 0 ,0),
('C',0  ,0  ,500,0),
('D',0  ,300,0  ,0),
('A',0,0,0  ,400),
('B',0,0,200,0);


CREATE TABLE normalised AS
SELECT x.* 
  FROM
  (
  SELECT party, 1 item, item_1 val FROM my_table
UNION ALL
SELECT party, 2, item_2 FROM my_table
UNION ALL
SELECT party, 3, item_3 FROM my_table
UNION ALL
SELECT party, 4, item_4 FROM my_table
) x
WHERE val <> 0;

DROP TABLE my_table;

SELECT * FROM normalised;
+-------+------+-----+
| party | item | val |
+-------+------+-----+
| B     |    1 | 300 |
| A     |    1 | 500 |
| A     |    2 | 500 |
| D     |    2 | 300 |
| C     |    3 | 500 |
| B     |    3 | 200 |
| A     |    4 | 400 |
+-------+------+-----+

答案 2 :(得分:0)

试试这个:

select party,
case 
    when Item_1 >0 then 'Item_1'
    when Item_2 >0 then 'Item_2'
    when Item_3 >0 then 'Item_3'
    when Item_4 >0 then 'Item_4'
end as 'Item',
case 
    when Item_1 >0 then Item_1
    when Item_2 >0 then Item_2
    when Item_3 >0 then Item_3
    when Item_4 >0 then Item_4
end as 'Value'
from my_table
where Item_1 >0 OR Item_2 >0 OR Item_3 >0 OR Item_4 >0;

结果:

的MySQL&GT;选择方,当Item_1> 0然后&#39; Item_1&#39;当Item_2> 0然后&#39; Item_2&#39;当Item_3&gt; 0然后&#39; Item_3&#39;当Item_4&gt; 0然后&#39; Item_4&#39;结束为&#39;项目&#39;,当Item_1> 0时的情况,然后当Item_2> 0时为Item_1,然后当Item_3> 0时为Item_2,然后当Item_4> 0时为Item_3,则Item_4结束为&#39;值&#39;来自my_table,其中Item_1&gt; 0或Item_2&gt; 0或Item_3&gt; 0或Item_4&gt; 0;

+-------+--------+------+
| party | Item   | Value |
+-------+--------+------+
| A     | Item_2 |  500 |
| B     | Item_1 |  300 |
| A     | Item_1 |  500 |
| C     | Item_3 |  500 |
| D     | Item_2 |  300 |
| A     | Item_4 |  400 |
| B     | Item_3 |  200 |
+-------+--------+------+
7 rows in set (0.00 sec)