2016-01-11 4 views
0

У меня есть код:удалить строки, которые содержат нулевые с помощью перекрестного соединения

SELECT Y.shipdate[Sent date], 
Rate_ = 'price' + Z.Which, 
Bill_ = 'bill' + Z.Which, 
       Rate = CASE Z.Which 
        WHEN '1' THEN price1 
        WHEN '2' THEN price2 
        WHEN '3' THEN price3 
        WHEN '4' THEN price4 
        WHEN '5' THEN price5 
        WHEN '6' THEN price6 END, 
       Bill = CASE Z.Which 
        WHEN '1' THEN bill1 
        WHEN '2' THEN bill2 
        WHEN '3' THEN bill3 
        WHEN '4' THEN bill4 
        WHEN '5' THEN bill5 
        WHEN '6' THEN billr6 END,   
    Y.duedate[Due Date], Y.recvdate[Received] 
    FROM tra Y 
    CROSS JOIN (SELECT '1' union ALL SELECT '2' UNION ALL SELECT '3' UNION ALL SELECT '4' UNION ALL SELECT '5' UNION ALL SELECT '6') Z (Which) 
    WHERE name = 'test' 

с выходом:

Sent Date     Rate_ Bill_ Rate Bill Due Date     Received 
2015-12-22 00:00:00.000  price1 bill1 0.55 300.00 2015-12-16 00:00:00.000 2015-12-01 00:00:00.000 
2015-12-22 00:00:00.000  price2 bill2 0.04 2.00 2015-12-16 00:00:00.000 2015-12-01 00:00:00.000 
2015-12-22 00:00:00.000  price3 bill3 0.07 43.00 2015-12-16 00:00:00.000 2015-12-01 00:00:00.000 
2015-12-22 00:00:00.000  price4 bill4 0.00 0.00 2015-12-16 00:00:00.000 2015-12-01 00:00:00.000 
2015-12-22 00:00:00.000  price5 bill5 0.00 0.00 2015-12-16 00:00:00.000 2015-12-01 00:00:00.000 
2015-12-22 00:00:00.000  price6 bill6 0.00 0.00 2015-12-16 00:00:00.000 2015-12-01 00:00:00.000 

Я хочу, чтобы выходной сигнал, который отображает только строки со значением в цене и счета. Основываясь на моем примере, на выходе должно быть только 3 строки. Благодарю.

+1

опубликуйте свой ожидаемый результат. также, если возможно, предоставить некоторые данные выборки. – pedram

ответ

0

попробовать это

where name = 'test' 
and CASE Z.Which 
     WHEN '1' THEN price1 
     WHEN '2' THEN price2 
     WHEN '3' THEN price3 
     WHEN '4' THEN price4 
     WHEN '5' THEN price5 
     WHEN '6' THEN price6 
    END <> 0.00 

Крест объединение создает декартово произведение двух таблиц. В отличие от других операторов JOIN, это не позволяет вам указывать предложение соединения. но в вашем случае вы используете фильтры для устранения строк. В таком случае лучше использовать Natural Join

+0

wow thanks! оно работает. – 404notfound

+0

Другая проблема, у вас есть идея о том, как удалить столбец rate_ и bill_? Благодарю. – 404notfound

+0

просто удалите эти столбцы, чтобы выбрать, что он будет работать нормально. – saikumarm

1

Это может быть достигнуто и другими способами, но это наиболее общий и будет работать в большинстве систем РСУБД. Используйте свой основной запрос в качестве подзапроса и дайте where условие

SELECT * FROM (
SELECT Y.shipdate[Sent date], 
Rate_ = 'price' + Z.Which, 
Bill_ = 'bill' + Z.Which, 
       Rate = CASE Z.Which 
        WHEN '1' THEN price1 
        WHEN '2' THEN price2 
        WHEN '3' THEN price3 
        WHEN '4' THEN price4 
        WHEN '5' THEN price5 
        WHEN '6' THEN price6 END, 
       Bill = CASE Z.Which 
        WHEN '1' THEN bill1 
        WHEN '2' THEN bill2 
        WHEN '3' THEN bill3 
        WHEN '4' THEN bill4 
        WHEN '5' THEN bill5 
        WHEN '6' THEN bill6 END,   
    Y.duedate[Due Date], Y.recvdate[Received] 
    FROM tra Y 
    CROSS JOIN (SELECT '1' union ALL SELECT '2' UNION ALL SELECT '3' UNION ALL SELECT '4' UNION ALL SELECT '5' UNION ALL SELECT '6') Z (Which) 
    WHERE name = 'test') TMP_TAB 
WHERE RATE <> 0 AND BILL <> 0 
+0

это тоже работает! благодаря! – 404notfound

Смежные вопросы