2017-12-21 5 views
1

各行に対して、サブクエリを使用して1つの列にカンマ区切り文字列を追加するクエリがあります。例えば、多くの部品に作業指示書が添付されている場合があります。私は通常のselectを行いますが、SQL関数 'STUFF'を使用して 'Parts'列を作成します。そのようにして、アートコラムには複数のエントリがあります。だから、私は列のサブクエリを行うには私は 'STUFF'を使用して、ベースクエリのメイン列IDを使用してすべての部分を取得する?これは私が説明するために少し変だが、このスニペットは、達成しよう:。?SQLの列サブ選択で現在の選択列値を使用する方法

-- 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 

だから、うまくいけば、私は十分にこれを明確に説明してきたことは、これを処理する方法には、私のパートの列が移入が、返されるモデルに十分にフィルタ処理されていないということで理由がある

+0

唯一の方法は、メインクエリで一時テーブルを作成し、Parts列を空のvarcharにすることです。次に、tempテーブルに別のUPDATEセレクトを作成して、ModelNumberという一時テーブルを使用してPartsカラムを埋めます。 – Casey

+0

いいえ、上記のクエリが行っていることについては、テンポラリテーブルを選択する必要はありません。 –

+1

これは、後でクエリの別のセクションで使用されるため、tmpを選択します。私は質問のためにこの部分を表示しました。 – Casey

答えて

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 
+0

私は必要なフィールドを熱狂させました。それは、STUFFクエリ内のベースslectデータに到達できる必要があります。そうでなければ、現在の行の部分だけではなく、すべての部分を取得します。 WHERE WO.WorkORderID = WOID(基本エイリアス) – Casey

+0

ご回答ありがとうございます。 – Casey

+0

あなたは今何を意味するのか分かります!ありがとう! – Casey

関連する問題