2017-06-19 161 views
0

我有兩個表 - Table1。具有音量的項目。和Table2。映射表。
表1。具有音量的項目。基於映射的計算

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

表2的映射表

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

我需要在表1中使用的映射來計算音量。例如,襯衫的 我看着映射表,看到我們有小,中,大尺寸。所以,我需要總結小型,中型和大型列從表1中的所有項目(不只是襯衫),這將是110

輸出表:

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

select step1.Item 
from 
(select t1.Item 
,t1.Small 
,t1.Medium 
,t1.Large 
from t1) step1 
full outer join 
t2 
on t1.Item=t2.Item 
group by t1.Item 
,t1.Small 
,t1.Medium 
,t1.Large 

想不通case語句。請幫忙!

+1

凱蒂,你可以使用

 and
標籤周圍的表使用固定寬度的字體。這將使他們更清晰。 –

+0

您的預期產量是多少? –

+0

@CraigYoung謝謝! – Katie

回答

0

因爲您的要求是「從表1中總結(具體尺寸)所有項目」,所以將每個尺寸的總數都計算在內是有益的。一個簡單的求和查詢(select sum(Small) as Small, sum(Medium)...)將作爲最終解決方案中的子查詢包含在內,以便可以輕鬆「查找」每個大小的總數。

爲了計算每個項目的體積,我們需要旋轉Mapping表,以便每個項目有一行,並且我們可以對每個映射的大小求和總計大小。使用上面的總計cross joincase語句將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 
+0

語法錯誤在或接近「大」......不知道爲什麼...... – Katie

+0

@Katie有多個「大」的實例;知道錯誤信息中哪一個指的是解決「爲什麼」很長的路要走。通常,這樣的錯誤表明缺少或錯位的逗號/等號/括號等。但更重要的是,正如我在答案中指出的那樣,您不能直接在mysql中使用它(_it是一個SQL Server查詢,並且在2008 R2上工作原樣或以上_)。但是,查詢本身是不使用任何高級功能的標準SQL。它應該適用於替換表名後在大多數平臺上工作。 –