我有一个查询,对于每一行,使用子查询将逗号分隔的字符串添加到一列。因此,例如,工单可以附加到许多部件。我做我的常规选择,但使用SQL函数'STUFF'来构建'Parts列。在结果中,艺术专栏有多个条目。所以我在列中使用'STUFF'进行子查询以使用基本查询的主列id获取所有部分?这对我来说有点奇怪,但是这个片段会帮助你理解我是什么试图完成:
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SET FMTONLY OFF;
IF OBJECT_ID('tempdb..#TEMP_KikusuiRpt') IS NOT NULL DROP TABLE #TEMP_KikusuiRpt
-- Get the current date to work on if they do not send in date params. Meaning it is automated run --
-- if hey do send in date ranges, then it is manual run
IF NULLIF(@StartDate, '') IS NULL
BEGIN
-- Set start date param to the first day of the current month
SET @StartDate = DATEADD(mm, DATEDIFF(mm,0,GETDATE()), 0)
END
IF NULLIF(@EndDate, '') IS NULL
BEGIN
-- Set end day to the last day what ever that may be of the current month.
SET @EndDate = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
END
SELECT
manufacturer.mfrname AS Manufacturer,
model.modelnumber AS BaseModelNumber,
control.controlserialnumber AS Serial,
Customer.CustCompany,
Control.ControlDateAdded as Received,
Control.ControlCalDate as 'Completed (Cal Date)',
WorkOrder.WorkOrderID as woid,
Receiver.ReceiverID,
WorkOrderComments.CommentRcvr as 'Receiver Comments',
WorkOrderCOmments.CommentRpt as 'Report Comments',
ISNULL(STUFF((SELECT ', ' + PartID
FROM WorkOrderPart WOP
INNER JOIN WorkORder WO ON WOP.WorkOrderID = WO.WorkOrderID
INNER JOIN Model ON Model.ModelID = WO.ModelID
WHERE WO.MfrCode IN (SELECT MfrCode FROM Manufacturer where MfrName LIKE '%Kikusui%')
--
-- Right here i need somehow to do this
--
-- the workorder on the stuff query needs to be attached to the base select work order row instance, or else i get all parts in each row not just for the work order
where wo.WorkOrderID = WOID
FOR XML PATH('')
), 1, 1, ''), 'NA') AS Parts
INTO #TEMP_KikusuiRpt
FROM WorkOrder
INNER JOIN Control ON WorkOrder.ControlNumber = Control.ControlNumber
INNER JOIN model ON control.modelid = model.modelid
INNER JOIN manufacturer on model.mfrcode = manufacturer.mfrcode
INNER JOIN WorkOrderComments ON WorkOrderComments.WorkOrderID = WorkOrder.WorkOrderID
INNER JOIN Receiver ON Receiver.ReceiverID = WorkOrder.ReceiverID
INNER JOIN Customer ON Customer.CustID = WorkOrder.CustID
WHERE Manufacturer.MfrName LIKE '%Kikusui%'
AND @StartDate > WorkOrder.DateReceived
AND @EndDate < WorkOrder.DateCompleted
SELECT * FROM #TEMP_KikusuiRpt
DROP TABLE #TEMP_KikusuiRpt
所以希望我已经足够清楚地解释了这一点。有办法处理这个吗?原因是我的Parts列已填充,但未过滤到返回的模型。
答案 0 :(得分:1)
您只需要对外部和内部model
表引用进行别名。这是主要选择的样子:
SELECT
manufacturer.mfrname AS Manufacturer,
m1.modelnumber AS BaseModelNumber,
control.controlserialnumber AS Serial,
Customer.CustCompany,
Control.ControlDateAdded as Received,
Control.ControlCalDate as 'Completed (Cal Date)',
WorkOrder.WorkOrderID as woid,
Receiver.ReceiverID,
WorkOrderComments.CommentRcvr as 'Receiver Comments',
WorkOrderCOmments.CommentRpt as 'Report Comments',
ISNULL(STUFF((SELECT ', ' + PartID
FROM WorkOrderPart WOP
INNER JOIN WorkORder WO ON WOP.WorkOrderID = WO.WorkOrderID
INNER JOIN Model m2 ON m2.ModelID = WO.ModelID
WHERE WO.MfrCode IN (SELECT MfrCode FROM Manufacturer where MfrName LIKE '%Kikusui%')
AND m1.modelnumber = m2.modelnumber
FOR XML PATH('')
), 1, 1, ''), 'NA') AS Parts
INTO #TEMP_KikusuiRpt
FROM WorkOrder
INNER JOIN Control ON WorkOrder.ControlNumber = Control.ControlNumber
INNER JOIN model m1 ON control.modelid = m1.modelid
INNER JOIN manufacturer on m1.mfrcode = manufacturer.mfrcode
INNER JOIN WorkOrderComments ON WorkOrderComments.WorkOrderID = WorkOrder.WorkOrderID
INNER JOIN Receiver ON Receiver.ReceiverID = WorkOrder.ReceiverID
INNER JOIN Customer ON Customer.CustID = WorkOrder.CustID
WHERE Manufacturer.MfrName LIKE '%Kikusui%'
AND @StartDate > WorkOrder.DateReceived
AND @EndDate < WorkOrder.DateCompleted