我有两张桌子 - 表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
无法弄清楚案例陈述。请帮忙!
答案 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