多个Where子句作为单独的列

时间:2014-06-13 20:51:50

标签: sql

我有一张销售订单表:

SALESORDERCODE  ITEMCODE    WAREHOUSECODE
SO-605338      ITEM-003200      MAIN
SO-605338      ITEM-016328      PFC

我还有一个库存表:

WAREHOUSECODE   ITEMCODE    UNITSINSTOCK
MAIN            ITEM-003200     1
MAIN            ITEM-016328     2
PFC             ITEM-016328     3
PFC             ITEM-003200     4

任何人都可以帮助我输出一系列连接:

SALESORDERCODE  ITEMCODE    UNITS IN MAIN   UNITS IN PFC
SO-605338      ITEM-003200         1             3
SO-605338      ITEM-016328         2             4

我可以编写一个WHERE子句,输出MAIN或PFC,但我需要并排列。

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

您可以使用INVENTORY表上的2个JOIN获得结果 - 您希望列中的每个WarehouseCode加入一个:

select 
  so.SALESORDERCODE,
  so.ITEMCODE,
  i_main.UNITSINSTOCK UnitsInMain,
  i_pfc.UNITSINSTOCK UnitsInPFC
from SalesOrder so
left join Inventory i_main
  on so.ItemCode = i_main.ItemCode
  and i_main.WAREHOUSECODE = 'Main'
left join Inventory i_pfc
  on so.ItemCode = i_pfc.ItemCode
  and i_pfc.WAREHOUSECODE = 'PFC';

SQL Fiddle with Demo。您会注意到,当您在INVENTORY表上左键加入时,您将包含要返回的WarehouseCode的过滤器。

如果您需要每个仓库中的总计单位,并不完全清楚,如果是这样,那么可以使用带有CASE表达式的聚合函数重写:

select
  so.SALESORDERCODE,
  so.ITEMCODE,
  sum(case when i.WAREHOUSECODE = 'Main' then i.UNITSINSTOCK end) UnitsInMain,
  sum(case when i.WAREHOUSECODE = 'PFC' then i.UNITSINSTOCK end) UnitsInPFC
from SalesOrder so
left join Inventory i
  on so.ItemCode = i.ItemCode
group by so.SALESORDERCODE,
  so.ITEMCODE;

请参阅SQL Fiddle with Demo

答案 1 :(得分:1)

不确定它是否可以在没有SQL小提琴的情况下工作,但这是我的第一个想法:

select sot.SALESORDERCODE,sot.ITEMCODE, sum(main.UNITSINSTOCK), sum(pfc.UNITSINSTOCK)
from sales_order_table sot
left join inventory_table main on sot.ITEMCODE=main.ITEMCODE and main.WAREHOUSECODE='MAIN'
left join inventory_table pfc on sot.ITEMCODE=pfc.ITEMCODE and pfc.WAREHOUSECODE='PFC'
group by sot.SALESORDERCODE,sot.ITEMCODE

如果同一产品在库存表中两次为main或pfc它总和。其他仓库代码怎么样?我们需要一个支点吗?

答案 2 :(得分:0)

如果仅限于这两个,您可以使用案例陈述: SQL Fiddle

select
SO.SalesOrderCode
,I.ITEMCODE
,sum(case when I.WAREHOUSECODE = 'MAIN' then  I.UNITSINSTOCK else 0 end) as MAIN
,sum(case when I.WAREHOUSECODE = 'PFC' then  I.UNITSINSTOCK else 0 end)
from
SalesOrder SO
inner join Inventory I
  ON SO.ITEMCODE = I.ITEMCODE
group by
SO.SalesOrderCode,
I.ITEMCODE

否则,根据您的RDBMS平台,您可以查看数据透视。