在另一个表中存储一组条件

时间:2012-09-03 16:33:26

标签: sql sql-server sql-server-2008 tsql join

我有一张包含销售数据的大表,下面是有用的数据:

RowID   Date        Customer  Salesperson   Product_Type    Manufacturer   Quantity   Value
1       01-06-2004  James     Ian           Taps            Tap Ltd        200        £850
2       02-06-2004  Apple     Fran          Hats            Hats Inc       30         £350
3       04-06-2004  James     Lawrence      Pencils         ABC Ltd        2000       £980
...
Many rows later...
...
185352  03-09-2012  Apple     Ian           Washers         Tap Ltd        600        £80

我需要从包含不同类型值的表中计算一大组目标,目标表在我的控制之下,到目前为止是这样的:

TargetID  Year   Month    Salesperson    Target_Type   Quantity
1         2012   7        Ian            1             6000
2         2012   8        James          2             2000
3         2012   9        Ian            2             6500

目前我正在使用第一个表的视图来计算目标类型,该表有很多额外的列:

    SELECT YEAR(Date)
         , MONTH(Date)
         , Salesperson
         , Quantity
         , CASE WHEN Manufacturer IN ('Tap Ltd','Hats Inc') AND Product_Type = 'Hats' THEN True ELSE False END AS IsType1
         , CASE WHEN Manufacturer = 'Hats Inc' AND Product_Type IN ('Hats','Coats') THEN True ELSE False END AS IsType2
    ...
    ...
         , CASE WHEN Manufacturer IN ('Tap Ltd','Hats Inc') AND Product_Type = 'Hats' THEN True ELSE False END AS IsType24
         , CASE WHEN Manufacturer IN ('Tap Ltd','Hats Inc') AND Product_Type = 'Hats' THEN True ELSE False END AS IsType25
FROM SalesTable
WHERE [some stuff here]

阅读/调试很糟糕,我讨厌 !!

我尝试过几种不同的方法来简化这种方法,但却无法让它发挥作用。 我最接近的是有一个第三个表,其中包含每个字段的值和类型编号的类型定义,这可以连接到表格以给我完整的值,但我无法找到方法为每个领域应对多个值。

最后一个问题:

对于每种类型的目标,是否有一种标准的方法可以做到这一点,或者更容易/更简洁的方法而不是一列?

我知道这是一个复杂的问题所以如果有什么不清楚请告诉我。

编辑 - 我需要获得的内容:

在流程的最后,我需要显示实际销售目标:

Type    Year    Month   Salesperson   TargetQty   ActualQty
2       2012    8       James         2000        2809
2       2012    9       Ian           6500        6251

销售表的每一行都可能满足其中的8种类型。

更多要点:

  1. 我有5个不同的列需要针对目标定义(或设置为NULL以包含任何值)
  2. 我需要定义30到40种不同的类型,其中几列可以包含多达10个不同的值
  3. 对于第2点,如果我为每个值的排列使用一行,那么每列10个值的2列将为每个销售人员提供每行100行,这是很多但是如果这是定义的唯一方法多个值我将不得不这样做。

    对不起,如果没有意义的话!

1 个答案:

答案 0 :(得分:1)

如果我是正确的,目标表中的“Target_Type”字段基于Manufacturer和Product_Type,那么您可以创建一个TargetType表,该表看起来像下面的内容和制造商上的JOIN以及Product_Type到得到你的Target_Type_Value:

ID   Product_Type    Manufacturer   Target_Type_Value
1    Taps            Tap Ltd        1
2    Hats            Hats Inc       2
3    Coats           Hats Inc       2
4    Hats            Caps Inc       3
5    Pencils         ABC Ltd        6

这应该通过为每种可能性设置一行来解决“每个字段的多个值”问题。