根据一列检查从Union获取的值

时间:2014-07-26 09:09:52

标签: 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           10    100      100
1000  TARGET    NEW           10    100      100

现在我想要一个标志,用于检查相同ID,相同类别,相同订单和相同音量的PRICE是否相等。

这样做时,必须在current_new列上进行比较。例如:Current_New的价格= ID为1000的新值,类别为LIMIT,订单10和第100卷必须使用Price of Current_New =当前值进行检查,ID为1000,类别为LIMIT,订单10和第100卷。如果等于则设置为标志为1,否则为0。

有人可以帮我解决这个问题。我被困住了。

2 个答案:

答案 0 :(得分: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;

请注意,此查询假定每个NEW行只有一个CURRENT行匹配,否则会产生重复行。

另一种编写方法是使用NOT EXISTS,它只检查匹配行的存在并相应地返回值;

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;

An SQLfiddle to test both

答案 1 :(得分:0)

如果我正确理解了问题,你可以使用窗口函数执行此操作:

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;