Sql 检查基于一列从Union获取的值
我有两个问题,我已经解决了。工会给我的数据如下:Sql 检查基于一列从Union获取的值,sql,sql-server,Sql,Sql Server,我有两个问题,我已经解决了。工会给我的数据如下: ID CATEGORY CURRENT_NEW ORDER VOLUME PRICE ------------------------------------------------- 1000 LIMIT CURRENT 10 100 50 1000 TARGET CURRENT 10 100 50 1000 LIMIT NEW
ID CATEGORY CURRENT_NEW ORDER VOLUME PRICE
-------------------------------------------------
1000 LIMIT CURRENT 10 100 50
1000 TARGET CURRENT 10 100 50
1000 LIMIT NEW 10 100 100
1000 TARGET NEW 10 100 100
现在我想有一个标志,它将检查相同ID、相同类别、相同订单和相同数量的价格是否相等
进行此操作时,必须对当前的新列进行比较。例如:当前_New的价格=ID 1000有类别限制的新值,订单10和卷100必须与当前_New=ID 1000有类别限制的当前值,订单10和卷100的价格进行检查。如果等于,则将标志设置为1,否则设置为0
有人能帮我一下吗。我陷入困境。编写此查询有多种方法。例如,您可以使用左联接根据您的条件查找完全匹配的行,如果与
NEW
的行不匹配,则返回1,否则返回0
SELECT m.*, CASE WHEN comp.id IS NULL AND m.CURRENT_NEW='NEW'
THEN 1 ELSE 0 END CHECK_FLAG
FROM mytable m
LEFT JOIN mytable comp
ON m.CURRENT_NEW = 'NEW'
AND comp.CURRENT_NEW = 'CURRENT'
AND m.CATEGORY = comp.CATEGORY
AND m.[ORDER] = comp.[ORDER]
AND m.VOLUME = comp.VOLUME;
请注意,此查询假定只有一个当前行与每一新行匹配,否则将给出重复的行
另一种写入它的方法是使用notexists,它只检查匹配行的存在性并相应地返回值
SELECT m.*, CASE WHEN CURRENT_NEW = 'NEW' AND NOT EXISTS (
SELECT 1 FROM mytable comp
WHERE comp.CURRENT_NEW = 'CURRENT'
AND m.CATEGORY = comp.CATEGORY
AND m.[ORDER] = comp.[ORDER]
AND m.VOLUME = comp.VOLUME
) THEN 1 ELSE 0 END CHECK_FLAG
FROM mytable m;
.如果我正确理解问题,您可以使用窗口功能执行此操作:
select uq.*,
(case when max(case when current_new = 'current' then price end) over
(partition by id, category, order, volume)) =
max(case when current_new = 'new' then price end) over
(partition by id, category, order, volume))
then 1 else 0
end) as flag
from unionquery uq;
从这个查询到您的样本数据,您希望得到的确切结果是什么?我希望得到的结果是在最后命名的CHECK_标志中有一列;基本上,我想检查基于上述注释/条件的值是否相等。我的目的是检查一个ID、一个订单、一个卷和一个类别的当前值的价格是否与新值的价格相同;如果不相同,则将此标志标记为1