Pivot和sqlserver中的一些问题

Pivot和sqlserver中的一些问题,sql,sql-server,Sql,Sql Server,帮助我获得这段代码,它输出良好,我可以看到在所选日期谁在项目中拥有仓库或行程,但我还想在Beg Bal不是0时输出,即使在所选日期仓库和行程表中没有发生任何事情 这是密码 Declare @to DATETIME Set @to = '2016-11-15' ;WITH tTable AS( Select i.ItemCode,Goods.Description,wQty,tQty,TripName, (Select ISNULL(SUM(fgd.Quantity),0) From Fini

帮助我获得这段代码,它输出良好,我可以看到在所选日期谁在项目中拥有仓库或行程,但我还想在Beg Bal不是0时输出,即使在所选日期仓库和行程表中没有发生任何事情

这是密码

Declare @to DATETIME
Set @to = '2016-11-15'

;WITH tTable AS(

Select i.ItemCode,Goods.Description,wQty,tQty,TripName,
(Select ISNULL(SUM(fgd.Quantity),0)
From FinishedGoodsDetails fgd 
LEFT JOIN FinishedGoods fg
ON fg.DeliveryReceiptNumber = fgd.DeliveryReceiptNumber
LEFT JOIN Warehouse w
ON w.WarehouseID = fg.WarehouseID
WHERE fg.CreatedOn < @to
AND fgd.ItemID = i.ItemID
AND fg.Status IN ('X','C')) - 
(Select ISNULL(SUM(drd.Quantity),0)
From DeliveryReceiptDetails drd
LEFT JOIN DeliveryReceipt dr
ON dr.DeliveryReceiptNumber = drd.DeliveryReceiptNumber
LEFT JOIN Trip t
ON t.TripID = dr.TripID
WHERE dr.DeliveredOn < @to
AND drd.ItemID = i.ItemID
AND dr.Status IN ('X','C')) AS 'Beg Bal',
(Select ISNULL(SUM(fgd.Quantity),0)
From FinishedGoodsDetails fgd 
LEFT JOIN FinishedGoods fg
ON fg.DeliveryReceiptNumber = fgd.DeliveryReceiptNumber
LEFT JOIN Warehouse w
ON w.WarehouseID = fg.WarehouseID
WHERE fg.CreatedOn < @to
AND fgd.ItemID = i.ItemID
AND fg.Status IN ('X','C')) - 
(Select ISNULL(SUM(drd.Quantity),0)
From DeliveryReceiptDetails drd
LEFT JOIN DeliveryReceipt dr
ON dr.DeliveryReceiptNumber = drd.DeliveryReceiptNumber
LEFT JOIN Trip t
ON t.TripID = dr.TripID
WHERE dr.DeliveredOn < @to
AND drd.ItemID = i.ItemID
AND dr.Status IN ('X','C')) + 
((Select ISNULL(SUM(fgd.Quantity),0)
From FinishedGoodsDetails fgd 
LEFT JOIN FinishedGoods fg
ON fg.DeliveryReceiptNumber = fgd.DeliveryReceiptNumber
LEFT JOIN Warehouse w
ON w.WarehouseID = fg.WarehouseID
WHERE fg.CreatedOn = @to
AND fgd.ItemID = i.ItemID
AND fg.Status IN ('X','C')) - 
(Select ISNULL(SUM(drd.Quantity),0) From DeliveryReceiptDetails drd
LEFT JOIN DeliveryReceipt dr
ON dr.DeliveryReceiptNumber = drd.DeliveryReceiptNumber
LEFT JOIN Trip t
ON t.TripID = dr.TripID
WHERE dr.DeliveredOn = @to
AND drd.ItemID = i.ItemID
AND dr.Status IN ('X','C')))
AS 'End Bal'

From Item i

LEFT JOIN
(Select ItemID,w.Description,ISNULL(SUM(fgd.Quantity),0) AS wQty From FinishedGoodsDetails fgd 
LEFT JOIN FinishedGoods fg
ON fg.DeliveryReceiptNumber = fgd.DeliveryReceiptNumber
LEFT JOIN Warehouse w
ON w.WarehouseID = fg.WarehouseID
WHERE fg.CreatedOn = @to
AND fg.Status IN ('X','C')
GROUP BY w.Description,fgd.ItemID) Goods
ON Goods.ItemID = i.ItemID

INNER JOIN
(Select ItemID,t.TripName,ISNULL(SUM(drd.Quantity),0) AS tQty From DeliveryReceiptDetails drd
LEFT JOIN DeliveryReceipt dr
ON dr.DeliveryReceiptNumber = drd.DeliveryReceiptNumber
LEFT JOIN Trip t
ON t.TripID = dr.TripID
WHERE dr.DeliveredOn = @to
AND dr.Status IN ('X','C')

GROUP BY t.TripName,drd.ItemID) Delivery
ON Delivery.ItemID = i.ItemID
)

Select * From tTable

Pivot
(SUM(wQty) FOR Description IN ([PRODN],[ADJ PCS],[BALASING],[RETURN PAM],
[RETURN BAT],[RETURN STM],[RETURN MAL],[RETURN SP],
[RET.SMKT1],[RET.SMKT2],[RET.SMKT3],[RET.SMKT4])) pivot1

Pivot
(SUM(tQty) FOR TripName IN ([C1],[C2],[C3],[C4],
[C5],[FAIR],[NOVA],[STM],
[MAL],[SP],[PAM],[SMKT1],
[SMKT2],[SMKT3],[SMKT4])) pivot2
预期产出为:

ItemCode Beg Bal End Bal PRODN ...... SMK4 
C900     270     272     64    ...... 50 
ItemCode Beg Bal End Bal PRODN ...... SMK4 
C800     50      50      0     ...... 0 
C900     270     272     64    ...... 50 

我猜您需要一个到子查询传递的左连接,而不是内部连接

我不确定为什么您提供了两个pivot片段,它们都不包括在上面的查询中

我不得不说,您在tTable的select子句中使用了几个相关的子查询,如下所示:

, (
      SELECT
            ISNULL(SUM(fgd.Quantity), 0)
      FROM FinishedGoodsDetails fgd
      LEFT JOIN FinishedGoods fg ON fg.DeliveryReceiptNumber = fgd.DeliveryReceiptNumber
      LEFT JOIN Warehouse w ON w.WarehouseID = fg.WarehouseID
      WHERE fg.CreatedOn < @to
      AND fgd.ItemID = i.ItemID
      AND fg.Status IN ('X', 'C')
  )

通常,这种类型的相关子查询是一个性能问题,在SQL Server中,将这种类型的逻辑移动到交叉应用或外部应用中可能会带来好处。

请编辑您的问题:1。在代码中添加缩进。2.不要在评论中发布附加数据在问题中发布
, (
      SELECT
            ISNULL(SUM(fgd.Quantity), 0)
      FROM FinishedGoodsDetails fgd
      LEFT JOIN FinishedGoods fg ON fg.DeliveryReceiptNumber = fgd.DeliveryReceiptNumber
      LEFT JOIN Warehouse w ON w.WarehouseID = fg.WarehouseID
      WHERE fg.CreatedOn < @to
      AND fgd.ItemID = i.ItemID
      AND fg.Status IN ('X', 'C')
  )