通过分组加入的订单值

时间:2013-11-27 13:16:48

标签: sql

上下文: 加入条件存在三个固定条件值。这些条件代表产品的加入状态。我在product.productid上获得了GROUP BY,并且只会看到该特定产品的最严重的附加条件。

期望的情况:

PRODUCTID   PRODUCTNAME     ACCESOIRESID    ACCESOIRESCONDITION
1           product1        2               defect
2           product2        3               working
3           product3        6               working

5 个答案:

答案 0 :(得分:1)

尝试此查询:

 select
    a.productid , 
    a.productname , 
    b.accesoiresid ,
    b.accesoirescondition
from product a
left join accesoires b on a.productid=b.productid
inner join 
(
  select d.productid, min(case 
        when d.accesoirescondition = 'defect'
          then 1
        when d.accesoirescondition = 'obsolete'
          then 2
        when d.accesoirescondition = 'working'
          then 3
        end) as severity
  from accesoires d
  group by d.productid
) c on b.productid = c.productid 
       and c.severity = 
        case 
          when b.accesoirescondition = 'defect'
            then 1
          when b.accesoirescondition = 'obsolete'
            then 2
          when b.accesoirescondition = 'working'
            then 3
        end

这将为您提供每种产品更严重的结果。

sqlfiddle demo

答案 1 :(得分:0)

我会为条件代码添加一个表而不是冗余字段,如下所示:

CREATE TABLE product (
  productid int,
  productname varchar(20)
);

CREATE TABLE cond (
  conditionid int,
  conditionname varchar(20)
);

CREATE TABLE accesoires (
  accesoiresid int,
  productid int,
  accesoiresname varchar(20),
  accesoirescondition int
);

INSERT INTO product VALUES
(1, 'product1'),
(2, 'product2'),
(3, 'product3');

INSERT INTO cond VALUES
(1, 'defect'),
(2, 'obsolete'),
(3, 'working');

INSERT INTO accesoires VALUES
(1, 1, 'accesoires1', 3),
(2, 1, 'accesoires2', 1),
(3, 1, 'accesoires3', 2),
(4, 2, 'accesoires4', 3),
(5, 3, 'accesoires5', 3),
(6, 3, 'accesoires6', 2);

然后你可以像这样查询:

SELECT p.productid, 
       p.productname,
       a.accesoiresid,
       c.conditionname
  FROM product p 
  JOIN accesoires a on p.productId = a.productId
  JOIN cond c on c.conditionid = a.accesoirescondition
 WHERE a.accesoirescondition =
       (SELECT MIN(accesoirescondition) 
          FROM accesoires 
         WHERE productId = p.productId )

结果是:

PRODUCTID   PRODUCTNAME ACCESOIRESID    CONDITIONNAME
1           product1    2               defect
2           product2    4               working
3           product3    6               obsolete

这看起来很像你想要的输出,期望第2行的AccesoiresId。但是永远不会与你提供的数据相比( IS 没有像在Accesoires for productid = 2)

http://sqlfiddle.com/#!2/a1db44/4

答案 2 :(得分:0)

好的,为了达到这个目的,我会做vkamayiannis所做的事情。 但是我建议将条件存储在一个单独的表中(在我的示例中为accessoryCondition

下面的SQL示例

CREATE TABLE product (
    productid int,
    productname varchar(20)
);

CREATE TABLE accessories (
    accesoiresid int,
    productid int,
    accesoiresname varchar(20),
    conditiontype int
);


CREATE TABLE accessoryCondition (
    conditiontype int,
    description varchar(20)
);

INSERT INTO product VALUES
(1, 'product1'),
(2, 'product2'),
(3, 'product3');

INSERT INTO accessories VALUES
(1, 1, 'accesoires1', 1),
(2, 1, 'accesoires2', 3),
(3, 1, 'accesoires3',  2),
(4, 2, 'accesoires4',  1),
(5, 3, 'accesoires5', 1),
(6, 3, 'accesoires6',  2);

INSERT INTO accessoryCondition VALUES
(1, 'working'),
(3, 'defect'),
(2, 'obsolete');

希望得到你想要的SQL结果,使用JOIN到表

select 
  p.productid, 
  p.productname, 
  a.accesoiresid, 
  AC.description
from 
product p
LEFT OUTER JOIN
accessories a
ON
p.productid = a.productid
LEFT OUTER JOIN
accessoryCondition AC
ON
A.conditionType = AC.conditiontype
WHERE
  AC.conditiontype IS NULL OR
  AC.conditiontype = 
  (
     select max(a2.conditiontype) 
     from accessories a2
     where a2.productid = a.productid
  )

或其他方式是使用嵌套选择,如下所示

SELECT 
    productid,
    productname,
    accesoiresid,
    AC.description AS 'Condition'
FROM
   (
       select 
          p.productid, 
          p.productname, 
          a.accesoiresid,
          MAX(a.conditionType) as 'HighestCondition'
       from 
         product p
       LEFT JOIN
         accessories a
       ON
         p.productid = a.productid
       LEFT JOIN
         accessoryCondition AC
       ON
         A.conditionType = AC.conditiontype
       GROUP BY
         p.productid
     ) products
 LEFT OUTER JOIN
    accessoryCondition AC
ON
   products.HighestCondition = AC.conditionType

答案 3 :(得分:0)

您可以尝试使用解码功能:

ORDER BY DECODE(accesoires.accesoirescondition ,'defect', 1,
'obsolete', 2, 
'working', 3) ASC 

答案 4 :(得分:-1)

我会在表accesoires conditiontype中添加另一个字段,它将是条件的整数represantation。这样的事情:

CREATE TABLE product (
  productid int,
  productname varchar(20)
);

CREATE TABLE accesoires (
  accesoiresid int,
  productid int,
  accesoiresname varchar(20),
  accesoirescondition varchar(20), 
  conditiontype int
);

INSERT INTO product VALUES
(1, 'product1'),
(2, 'product2'),
(3, 'product3');

INSERT INTO accesoires VALUES
(1, 1, 'accesoires1', 'working', 1),
(2, 1, 'accesoires2', 'defect', 3),
(3, 1, 'accesoires3', 'obsolete', 2),
(4, 2, 'accesoires4', 'working', 1),
(5, 3, 'accesoires5', 'working', 1),
(6, 3, 'accesoires6', 'obsolete', 2);

正如您所看到的,最糟糕的情况有更高的数字。所以我的查询就像:

select p.productid, p.productname, a.accesoiresid, a.accesoirescondition
from product p, accesoires a
where p.productid = a.productid
and a.conditiontype = (select max(a1.conditiontype) 
                       from accesoires a1 
                       where a1.productid = a.productid)