基于映射的计算

时间:2017-06-19 23:12:55

标签: mysql sql

我有两张桌子 - 表1。有体积的物品。和表2。映射表。
表格1。有体积的物品。

fixer->endChangeset()

表2.映射表

Item   |  Small  | Medium  |  Large  |  XLarge|  Volume  
-------|---------|---------|---------|--------|-----------   
Shirt  |---10----|----0----|---20----|---0----|-----------  
-------|---------|---------|---------|--------|-----------  
Pants  |----0----|----30---|---10----|---20---|-----------  
-------|---------|---------|---------|--------|-----------  
Skirts |----0----|----30---|---10----|---20---|-----------  
-------|---------|---------|---------|--------|-----------

我需要使用映射计算表1中的Volume。例如, 对于衬衫,我看一下映射表,看看我们有小,中,大尺寸。因此,我需要总结表1中的小,中,大列所有项目(不仅仅是衬衫),这将是110。

输出表:

Item  |Size  
------|-------  
Shirt |small  
------|-------  
Shirt |medium  
------|-------   
Shirt |large  
------|-------  
Pants |large  
------|-------  
Skirts|medium

无法弄清楚案例陈述。请帮忙!

1 个答案:

答案 0 :(得分:0)

因为您的要求是从表1中总结(特定尺寸)所有项目",所以从每个尺寸的总数中获取总计是有益的。一个简单的求和查询(select sum(Small) as Small, sum(Medium)...)将作为子查询包含在最终解决方案中,以便可以轻松地查看每个大小的总数"。

为了计算每个项目的体积,我们需要透视Mapping表,以便每个项目有一行,我们可以将每个映射大小的大小总和相加。对上面的总计使用cross join,并使用case语句将Mapping.Size值转换为相应的总值。

作为最后一步,从Table1中选择以获取具有大小特定卷的源项目;并作为子查询加入上面以获得相应的总量。

下面的查询使用SQL Server表变量来演示使用您的示例数据。您可以使用适当的mysql替换来替换确认。

declare @Table1 table (
   Item varchar(10),
   Small int, Medium int, Large int, XLarge int)
insert into @Table1 values
('Shirt', 10, 0, 20, 0),
('Pants', 0, 30, 10, 20),
('Skirts', 0, 30, 10, 20)

declare @Mapping table(
   Item varchar(10),
   Size varchar(10))
insert into @Mapping values
('Shirt', 'small'),
('Shirt', 'med'),
('Shirt', 'large'),
('Pants', 'large'),
('Skirts', 'med')

select  a.*, v.Volume
from    @Table1 a
        /* Join main table back to mapping based summary for final result */
        left join (
        /* The following is a "manual pivot" technique used to 
           transform rows into aggregated columns. */
        select  m.Item,
                /* Aggregate totals accoring to the mapping */
                sum(
                case m.Size
                    when 'large' then t.Large
                    when 'med' then t.Medium
                    when 'small' then t.Small
                    when 'xlarge' then t.XLarge
                    else 0
                end
                ) Volume
        from    @Mapping m
                cross join (
                     /* Get totals of each column */
                     select  sum(Small) Small,
                             sum(Medium) Medium, 
                             sum(Large) Large, 
                             sum(XLarge) XLarge
                     from    @table1
                ) t
        group by m.Item
        ) v on v.Item = a.Item