【问题标题】:Storing a set of criteria in another table在另一个表中存储一组标准
【发布时间】:2012-08-28 09:39:42
【问题描述】:

我有一个包含销售数据的大表,有用的数据如下:

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

sales 表的每一行可能满足 8 种类型。

还有几点:

  1. 我有 5 个不同的列需要针对目标定义(或设置为 NULL 以包含任何值)
  2. 我有 30 到 40 种不同的类型需要定义,其中几列可能包含多达 10 个不同的值

对于第 2 点,如果我为每个值排列使用一行,每列有 10 个值的 2 列将为每个月的每个销售人员提供 100 行,但如果这是定义的唯一方法多个值,我将不得不这样做。

对不起,如果这没有意义!

【问题讨论】:

  • 您能提供更多信息吗?目标类型由制造商列表和单个产品类型定义?听起来第三个(目标类型定义)表是这里的正确选择。使用它到底有什么问题?
  • 使用另一个表时的问题是当一个或多个字段需要多个项目时,我通常会使用IN ('X','X') 执行此操作,但我不知道如何执行此操作加入。
  • 看看@Ojen 的回答。您可以从 SalesTable 中选择 * 在 Manufacturer 和 Product_Type 上连接此表。这样你就可以得到 TargetType(s)。
  • 看来这实际上是一个“目标与实际销售额”表应该如何设计的问题。看起来一个销售人员只有一个 TargetQty 和一个 ActualQty,而且这些 Qty 并不特定于目标类型。所以真正的问题是:您是否应该有一个作为目标类型分隔列表的字段,还是应该有 30 个 isTypeX 列。那准确吗?另外,TargetType 是基于销售人员(例如,Ian 以类型 1、2 和 4 进行交易)还是基于实际销售的目标类型(Ian 本月销售的类型 1、4 和 6)?跨度>
  • 一个销售人员有几种不同的类型(Ian 交易属于类型 1、2 和 4),并且对于每种类型,他们都有一个单独的目标编号,一个人可以拥有多个相同的目标类型和一笔交易可以计入一位或多位销售人员,我认为这使得正确处理非常棘手。

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


【解决方案1】:

如果我认为目标表中的“Target_Type”字段基于制造商和 Product_Type 是正确的,那么您可以创建一个如下所示的 TargetType 表以及制造商和 Product_Type 上的 JOIN 来获取您的目标类型值:

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

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

【讨论】:

  • 这看起来很有希望,尽管一个销售交易可能会满足多个 Target_Type 的一个,但这是否只需要多个连接到同一个表?
  • @bendataclear 您希望您的最终数据是什么样的?现在你的“目标表”有一个单独的列来识别“Target_Type”。在“目标表”中,每一行都是一个事务,或者可能有两行同时属于 Target_Type 1 和 Target_Type 2 的事务?
  • 我会在帖子中添加我想要获取的内容。
  • 这就是我最终要做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多