问题
I have a table called purchase_hs
and I have different types of level dates and different types of transport modes and quantity like below. Now my requirement is I need to consider only one level date column per row. Suppose if we have level1
and remaining all are empty then we need to add 28 days based on the transport mode (sea
= 28days , air
=14 days , truck
= 5 days and transport mode
is empty then 28 days) and display the level1
date quantity. If we have level1
date and level2
date and remaining all are empty then need to take level2
date quantity, if we have level1
, level2
, and level3
dates and level4
,level5
are empty then we need to take level3 quantity and so on. For level4
and level5
dates we don't need to add any days based on transport. We need to consider transport mode only for level1
,level2
and level3
dates. To achieve this below is my query, but it not working.
SELECT level1,
level2,
level3,
level4,
level5,
trasprt Quantity,
CASE
WHEN level1 != ''
AND level2 = ''
AND level3 = ''
AND level4 = ''
AND level5 = ''
AND trasprt = 'SEA'
THEN DATE_ADD(level1, INTERVAL 28 DAY) level1
WHEN level1 != ''
AND level2 != ''
AND level3 = ''
AND level4 = ''
AND level5 = ''
AND trasprt = 'AIR'
THEN DATE_ADD(STR_TO_DATE(level2, '%d.%m.%Y'), INTERVAL 14 DAY) level2
WHEN level1 != ''
AND level2 != ''
AND level3 != ''
AND level4 = ''
AND level5 = ''
AND trasprt = 'TRK'
THEN DATE_ADD(STR_TO_DATE(level3, '%d.%m.%Y'), INTERVAL 5 DAY) level3
WHEN level1 != ''
AND level2 != ''
AND level3 != ''
AND level4 != ''
AND level5 = ''
THEN level4
WHEN level1 != ''
AND level2 != ''
AND level3 != ''
AND level4 != ''
AND level5 != ''
THEN level5
ELSE
END
FROM purchase_hs where stock_id = '4046228100449'
Table:
+------------+------------+------------+------------+--------+----------+----------------+---------------+
| level1 | level2 | level3 | level4 | level5 | Stock Qty | transport | StockId|
+------------+------------+------------+------------+--------+----------+----------------+---------------+
| 2015-01-17 | 15.04.2015 | | | | 150.0000 | SEA | 4046228100449 |
| 2015-02-17 | 20.01.2015 | 17.02.2015 | | | 150.0000 | SEA | 4046228100450 |
| 2015-01-15 | 05.04.2015 | 05.04.2015 | 03.05.2015 | | 2.0000 | | 4046228100451 |
+------------+------------+------------+------------+--------+----------+----------------+---------------+
My Result table would be :If i have only level1 and level2 dates and transport mode is SEA (need to add 28 days to resulting level date)then the result would be
+------------+----------+---------------+
| level2 | StockQty | StockId |
+------------+----------+---------------+
| 13.05.2015 | 150.0000 | 4046228100449 |
+------------+----------+---------------+
If i have only level1 date and remaining all level dates are emtpy and transport mode is AIR (need to add 14 days to resulting level date) then the result would be
+------------+----------+---------------+
| level1 | menge_pe | ean |
+------------+----------+---------------+
| 2015-01-31 | 150.0000 | 4046228100449 |
+------------+----------+---------------+
If i have only level1 date, level2 date, level3 date and level4,level5 are empty then transport mode is TRK (need to add 5 days to resulting level date) then the result would be
+------------+----------+---------------+
| level3 | menge_pe | ean |
+------------+----------+---------------+
| 22.02.2015 | 150.0000 | 4046228100449 |
+------------+----------+---------------+
If i have only level1 date, level2 date, level3 date and level4 are having values and level5 is (we don't need to consider 28/14/5 days based on transport mode for level4 and level5 dates) then the result would be
+------------+----------+---------------+
| level4 | menge_pe | ean |
+------------+----------+---------------+
| 03.05.2015 | 150.0000 | 4046228100449 |
+------------+----------+---------------+
So can any one please guide me where I am doing wrong?
来源:https://stackoverflow.com/questions/29398193/how-to-check-multiple-columns-whether-they-are-empty-or-not-using-mysql-case