【发布时间】: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 种类型。
还有几点:
- 我有 5 个不同的列需要针对目标定义(或设置为 NULL 以包含任何值)
- 我有 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