【问题标题】:How to make query table with generated "dynamic" column from another table's row?如何从另一个表的行生成具有“动态”列的查询表?
【发布时间】:2012-06-19 18:52:55
【问题描述】:

这些是我想要合并的 TBL_MATERIALS 和 TBL_PRODUCTS 的源表。 根据 TBL_MATERIALS 中的行数,列应该是动态的。

TBL_MATERIALS

|===============================|                               
|MATERIAL           |      Gram |                           
|-------------------------------|                              
|Flour-Hard         |      25   |               
|Flour Soft         |      76   |                 
|Sugar-White        |      25   |                      
|Sugar-Washed       |      15   |                   
|Sugar-Brown        |      10   |                      
|CalciumPropionate  |      2.5  |                                  
|SodiumBenzoate     |      2    |                              
|TartarCream        |      5    |                     
|MilkSkimmed        |      20   |                
|===============================|                                    

TBL_PRODUCTS

|===============================|                               
|Product            |     Batch |                              
|-------------------------------|                                                 
|Ameriloaf          |     5     |                         
|Peter Pann         |     2.5   |                            
|Chizmada           |     3     |                        
|Ubemada            |     8     |                            
|Millionaire        |     9     |                      
|Sweet Maria        |     2.5   |                          
|Butter Tarts       |     1.25  |                              
|Caramel Croquette  |     4     |                                  
|Garlic Stick       |     11    |                               
|===============================|

这就是我想要的表格应该是什么样子。 QUERY_CUSTOM 的列应该是动态的,当我在 TBL_MATERIALS 上添加新项目时,应该显示下表的新列。我想我们会使用 CREATE TABLE 之类的东西。我还在研究这件事。 我希望这能帮助你理解。

QUERY_CUSTOM                                                                 
|=================================================================================================|
|Product            |     Batch | Flour-Hard | Flour-Soft | Sugar-White | Sugar-Washed | etc.etc. |    
|-------------------------------------------------------------------------------------------------|     
|Ameriloaf          |     5     | Gram*Batch | ALL BLANK  |             |              |          |
|Peter Pann         |     2.5   |ex.25*2.5=75| CELLS      |             |              |          |
|Chizmada           |     3     |      "     | SHOULD     |             |              |          |
|Ubemada            |     8     |      "     | BE FILLED  |             |              |          |
|Millionaire        |     9     |      "     | WITH       |             |              |          |
|Sweet Maria        |     2.5   |      "     |[GRAM]      |             |              |          |
|Butter Tarts       |     1.25  |      "     | MULTIPLIED |             |              |          |
|Caramel Croquette  |     4     |      "     | BY CORRESP.|             |              |          |
|Garlic Stick       |     11    |      "     |[BATCH]     |             |              |          |
|=================================================================================================|

【问题讨论】:

  • 所有材料都适用于所有产品吗?我没有看到表明哪些材料与哪些产品相关的关系
  • 是的,所有产品。我刚填了第一个bec。但一切都会被填满。例如.. Row->Millionaire with a Column->Sugar-White 所以公式将变为:[Batch] * [Gram] so... 9 * 25 = 225
  • 我现在已经编辑/澄清了示例。
  • 那么,你们所有产品的材料比例都一样吗?他们都有Flour-Hard / TartarCream = 25 / 5 = 5.0 ??
  • 我做了这个逻辑上不正确,而是一个演示。基本上它就像映射 x 和 y ex。 Butter Tarts & Sugar-White: 所以.. 1.25 * 25 = 31.05 所以这在逻辑上是不合理的或排序的,我只是选择这些名字来回忆它们(我从我的数据库中撕下来)。

标签: sql database-design datatable report


【解决方案1】:
select
      Product
    , Batch
    , sum( case when Material = 'Flour-Hard'        then Product_Grams else 0.0 end ) as Flour_Hard
    , sum( case when Material = 'Flour-Soft'        then Product_Grams else 0.0 end ) as Flour_Soft 
    , sum( case when Material = 'Sugar-White'       then Product_Grams else 0.0 end ) as Sugar_White 
    , sum( case when Material = 'Sugar-Washed'      then Product_Grams else 0.0 end ) as Sugar_Washed
    , sum( case when Material = 'Sugar-Brown'       then Product_Grams else 0.0 end ) as Sugar_Brown
    , sum( case when Material = 'CalciumPropionate' then Product_Grams else 0.0 end ) as CalciumPropionate
    , sum( case when Material = 'SodiumBenzoate'    then Product_Grams else 0.0 end ) as SodiumBenzoate
    , sum( case when Material = 'TartarCream'       then Product_Grams else 0.0 end ) as TartarCream
    , sum( case when Material = 'MilkSkimmed'       then Product_Grams else 0.0 end ) as MilkSkimmed
from (
    select
          a.Product
        , a.Batch
        , b.Material
        , b.Gram
        , (a.Batch * b.Gram) as Product_Grams
    from       TBL_PRODUCTS  as a
    cross join TBL_MATERIALS as b
) as xx
group by Product, Batch
order by Product
;

【讨论】:

  • 感谢您的尝试,但这不是我正在寻找的答案,您能否使其动态化,当我在 TBL_Materials 中添加新项目时,QUERY_CUSTOM 表上将显示一个新列。无论如何,谢谢。
  • @JesKeshlyCruz;我明白了,这可以“简单”地用动态 SQL 生成,这里是一个例子stackoverflow.com/questions/1914303/…
【解决方案2】:

如果我正确理解您的问题,您需要使用插入和更新公式。定义外键时,附加'on update cascade'。这使得引用的值随之更新。

【讨论】:

  • 不幸的是,我对这些不是很熟悉。你可以发布代码吗?或举个例子。还是谢谢。
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多