我需要验证每个订单是否已得到确认。问题是每个订单可以有多个代码。我拥有的查询(使用CASE
语句)将检查空白字段或字段“无”以确认订单尚未确认。它将返回适当的结果,但多个行(每个可能的响应一次),我只需要(1)。
我正在尝试创建一个临时表,它将返回相应的结果并连接(通过订单唯一ID)这两个表一起希望纠正多行问题。这是代码:
DROP TABLE staging_TABLE;
CREATE TEMP TABLE staging_TABLE(
ORDERID varchar(256) ,
CODE varchar(256) );
/*Keeping data types consistent with the real table*/
INSERT INTO staging_TABLE
SELECT ORDERID,
CASE CODE
WHEN 'None' THEN 'No'
WHEN '' THEN 'No'
ELSE 'Yes'
END
FROM ORDERS
WHERE UTCDATE > SYSDATE - 10
AND CODE IS NOT NULL;
SELECT R.QUESTION,
R.ORDERNAME,
T.CODE
FROM ORDERS R
INNER JOIN staging_TABLE T
ON R.ORDERID= T.ORDERID
WHERE R.UTCDATE > SYSDATE - 10
AND R.CODE IS NOT NULL
AND R.CATEGORY IS NOT NULL
AND R.UTCDATE IS NOT NULL
GROUP BY
R.ORDER,
T.CODE,
R.ORDERNAME,
R.CODE
ORDER BY
R.ORDERNAME,
R.ORDER;
我这样做是否正确?或者这是正确的方法吗?
答案 0 :(得分:1)
我这样做是否正确?或者这是正确的方法吗?
没有。你不需要临时表。您的查询可能如下所示:
SELECT question, ordername
, CASE WHEN code IN ('None', '') THEN 'No' ELSE 'Yes' END AS code
FROM orders
WHERE utcdate > sysdate - 10
AND code IS NOT NULL
AND category IS NOT NULL
GROUP BY question, ordername, 3, "order"
ORDER BY ordername, "order";
ORDER
是保留字。除非双引号,否则无法将其用作列名。那里有些不对劲。
AND R.UTCDATE IS NOT NULL
是多余的。使用WHERE R.UTCDATE > SYSDATE - 10
3
子句中的 GROUP BY
是对CASE表达式的位置引用。或者你可以再拼出来:
....
GROUP BY question, ordername
, CASE WHEN code IN ('None', '') THEN 'No' ELSE 'Yes' END
, "order"
答案 1 :(得分:0)
您可以按如下方式使用DISTINCT关键字,这样您就不需要临时表:
SELECT DISTINCT QUESTION,
ORDERNAME,
CASE CODE
WHEN 'None' THEN 'No'
WHEN '' THEN 'No'
ELSE 'Yes'
FROM ORDERS
WHERE UTCDATE > SYSDATE - 10
AND CODE IS NOT NULL
AND CATEGORY IS NOT NULL
AND UTCDATE IS NOT NULL
ORDER BY 2,3;