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