让SUM和JOIN在特定查询中合作

时间:2012-03-20 13:34:36

标签: mysql

我坚持使用某个查询,它似乎很简单,但似乎我可能不得不以不同的方式拆分它以实现我想要做的事情。我尝试了组合,重组,我可以使用一些指导。

这是一个示例表,输出和预期输出。

Shop_Table

shop_id |     item_type  | date

   1          soaps         2000-01-01
   2          food          2000-01-02
   3          appliances    2000-01-03
   4          electronics   2000-01-10
   5          furniture     2000-01-13
   6          misc.         2000-01-15

Instance_Table

instanceid|    shop_id    | firstname | lastname | number_of_items

   11            3            jane        doe          2
   22            2            jane        doe          3
   33            1            jane        doe          5
   44            4            jane        doe          6
   55            6            jane        doe          1
   66            5            jane        doe          2

查询

SELECT 
IF
( 
    Shop_Table.item_type
    IN
        (
            'soaps',
            'food'
         ),
    'indexpensives',
    Shop_Table.item_type
), 
COALESCE(SUM(Person.number_of_items), 0) AS item_sum
FROM Shop_Table

INNER JOIN Instance_Table AS Instance
ON Instance.shop_id = Shop_Table.shop_id
AND Instance.firstname =  'jane'
AND Instance.lastname =  'doe'
AND Shop_Table.date BETWEEN DATE(  '2000-01-01' ) AND DATE(  '2000-01-03' )

GROUP BY Shop_Table.item_type

返回:

  item_type     |     item_sum

indexpensives   |        8
appliances      |        2

输出

到目前为止哪个很棒,而且是我被困的地方。我真正想要的是以下输出:

预期产出

  item_type     |     item_sum

inexpensives    |        8
appliances      |        2
electronics     |        0
furniture       |        0
misc.           |        0

我认为我想要做的事情非常简单。让它变得有点艰难的是它有一点点的东西。

  • 对总和结果进行分组和组合(肥皂和食物合并为一个结果)
  • 当日期超出指定范围时,为其余项目类型返回0。

更新

比我想象的要复杂一点,但这就是我想要的。谢谢大家的帮助。

SELECT 
IF
( 
    Shop_Table.item_type
    IN
        (
            'soaps',
            'food'
         ),
    'inexpensives',
    Shop_Table.item_type
), 
COALESCE(SUM(Person.number_of_items), 0) AS item_sum
FROM Shop_Table
LEFT OUTER JOIN Instance_Table AS Instance
ON Instance.shop_id = Shop_Table.shop_id
AND Instance.firstname =  'jane'
AND Instance.lastname =  'doe'
AND Shop_Table.date BETWEEN DATE(  '2000-01-01' ) AND DATE(  '2000-01-03' )
GROUP BY IF
( 
    Shop_Table.item_type
    IN
        (
            'soaps',
            'food'
         ),
    'inexpensives',
    Shop_Table.item_type
)

2 个答案:

答案 0 :(得分:1)

将您的查询更改为此,您应该获得您正在寻找的总数:

SELECT 
IF
( 
    Shop_Table.item_type
    IN
        (
            'soaps',
            'food'
         ),
    'indexpensives',
    Shop_Table.item_type
), 
SUM(Person.number_of_items) AS item_sum
FROM Shop_Table

LEFT OUTER JOIN Instance_Table AS Instance
ON Instance.shop_id = Shop_Table.shop_id
AND Instance.firstname =  'jane'
AND Instance.lastname =  'doe'
AND Shop_Table.date BETWEEN DATE(  '2000-01-01' ) AND DATE(  '2000-01-03' )

GROUP BY Shop_Table.item_type

<强>解释
外连接将从一个表中选择所有行,并从另一个表中选择匹配的行。因此,LEFT OUTER JOIN将从连接左侧的表中选择所有行(在本例中为Shop_Table),并从连接右侧的表中匹配行(在本例中为Instance_Table)。

答案 1 :(得分:1)

首先用inner join替换left join,然后确保coalesce sum为0,如下所示:

SELECT 
IF
( 
    Shop_Table.item_type
    IN
        (
            'soaps',
            'food'
         ),
    'indexpensives',
    Shop_Table.item_type
), 
COALESCE(SUM(Person.number_of_items), 0) AS item_sum
FROM Shop_Table
LEFT JOIN Instance_Table AS Instance
ON Instance.shop_id = Shop_Table.shop_id
AND Instance.firstname =  'jane'
AND Instance.lastname =  'doe'
AND Shop_Table.date BETWEEN DATE(  '2000-01-01' ) AND DATE(  '2000-01-03' )
GROUP BY Shop_Table.item_type

修改

需求更改后,这应该是最终查询:

SELECT 
IF
( 
    Shop_Table.item_type
    IN
        (
            'soaps',
            'food'
         ),
    'inexpensives',
    Shop_Table.item_type
) as FinalType, 
COALESCE(SUM(Person.number_of_items), 0) AS item_sum
FROM Shop_Table
LEFT OUTER JOIN Instance_Table AS Instance
ON Instance.shop_id = Shop_Table.shop_id
AND Instance.firstname =  'jane'
AND Instance.lastname =  'doe'
AND Shop_Table.date BETWEEN DATE(  '2000-01-01' ) AND DATE(  '2000-01-03' )
GROUP BY FinalType