使用交叉连接删除包含 null 的行
remove rows that contains null using cross join
我有我的代码:
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 行。谢谢。
试试这个
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
也可以通过其他方式实现,但这是最通用的方式,适用于大多数 RDBMS 系统。使用您的主查询作为子查询并给出 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
我有我的代码:
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 行。谢谢。
试试这个
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
也可以通过其他方式实现,但这是最通用的方式,适用于大多数 RDBMS 系统。使用您的主查询作为子查询并给出 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