大家好,周五快乐。
我正在尝试编写一个SSRS报告,显示来自三个表(实际上有约12个表,但只涉及其中三个)的数据,它们之间的关联关系很棘手,该数据背后的SQL查询变得非常困难。
这里涉及三个实体 - 采购订单、销售订单和交付。问题在于采购订单可以拥有多个销售订单,并且还可能有许多与销售订单无关联的交货日期......这样做太容易了。
销售订单和交货日期两个表格都可以通过外键和各自的中间表格与采购订单表格相关联。
我需要列出采购订单、销售订单列表和相应的交货日期列表,对于任何不合法的字段,将其置空,以便在SSRS/人类阅读时产生所需的输出,例如,对于具有2个销售订单和4个交货日期的采购订单;
PO SO Delivery
1234 ABC 05/10
1234 DEF 09/10
1234 NULL 10/12
1234 NULL 14/12
以上内容(按PO分组)将向用户显示有两个销售订单和四个(未关联)交货日期。
同样,如果销售订单(SOs)数量大于交货(deliveries)数量,则需要在交货列中使用NULL值;
PO SO Delivery
1234 ABC 03/08
1234 DEF NULL
1234 GHI NULL
1234 JKL NULL
如果有4个销售订单和一个交货日期,那么使用左外连接会生成太多的重复数据 - 在这种情况下,它会为每个销售订单的匹配值生成4个交货日期,因此会生成8行数据。
PO SO Delivery
1234 ABC 05/10
1234 ABC 09/10
1234 ABC 10/12
1234 ABC 14/12
1234 DEF 05/10
1234 DEF 09/10
1234 DEF 10/12
1234 DEF 14/12
PO列重复并不影响,在SSRS中可以进行视觉分组,但是SO/交货字段不能重复,因为在报表中无法消除重复,如果我按SO在SSRS中对列进行分组,那么每个SO会产生4个交货日期。
我们的查询只在PO下只有一个SO时才有效。在这种情况下,单个PO和SO号码将重复X次交付,并且可以在SSRS中整齐地分组。不幸的是,这在数据中很少发生。
我想过尝试使用某种窗口函数或CROSS APPLY,但两者都失败了,因为它们将重复列出每个PO号码并最终产生太多数据。
在思考到这个问题不足以在SQL中实现时,我知道数据非常糟糕...
非常感谢任何帮助。
编辑-基本的sqlfiddle链接到表模式。省略许多不相关的列。http://sqlfiddle.com/#!2/5ba16
示例数据...
Purchase Order
PO_Number Style
1001 Black work boots
1002 Green hat
1006 Red Scarf
Sales Order
Sales_order_number PO_number Qty Retailer
A100-21 1001 15 Walmart
A100-22 1001 29 Walmart
A200-31 1006 1000 Asda
Delivery
Delivery_ID Delivery_Date PO_number
1543285 10/05/2014 1001
1543286 12/05/2014 1001
1543287 17/05/2014 1001
1543288 21/05/2014 1002