将第二个查询作为第一个查询的字段

时间:2016-08-09 07:49:03

标签: sql

我很擅长编写查询,而我正在努力解决下一个问题:

SELECT od.ODCode
 , c.Description as 'Line Position'
 , ps.Description as 'Pallet Stacking'
 , pt.Description as 'Pallet Type'
 , odex.PalletRows
 , odex.PalletTypeID
 ,CONCAT((  SELECT sp.SpecPropertyValue FROM SpecificationProperty sp 
 INNER JOIN specificationclass sc ON sc.specclassid = sp.specclassid 
 INNER JOIN specificationcode sco ON sco.specclassid = sc.specclassid and sco.speccodeid = pt.pallettypeid
 INNER JOIN SpecificationClassProperty scp ON scp.specClassid = sp.specclassid and scp.specpropertyid = sp.specpropertyid and sco.speccodeid = sp.speccodeid 
 WHERE scp.specpropertyname  = 'DocDir'and sc.specclassname = 'Pallettypedoc' 
),
(SELECT sp.SpecPropertyValue FROM SpecificationProperty sp 
INNER JOIN specificationclass sc ON sc.specclassid = sp.specclassid 
INNER JOIN specificationcode sco ON sco.specclassid = sc.specclassid and sco.speccodeid = pt.pallettypeid
INNER JOIN SpecificationClassProperty scp ON scp.specClassid = sp.specclassid and scp.specpropertyid = sp.specpropertyid and sco.speccodeid = sp.speccodeid 
WHERE scp.specpropertyname  = 'Documentname'and sc.specclassname = 'Pallettypedoc' )) AS Spec     
FROM ODExitPallet odex
INNER JOIN OperationDescr od
ON od.OperationDescrID=odex.OperationDescrID
INNER JOIN PalletStacking ps 
ON ps.PalletStackingID=odex.PalletStackingID
INNER JOIN PalletType pt
ON pt.PalletTypeID=odex.PalletTypeID
INNER JOIN Code c
on c.CodeNumber=odex.LinePosition and c.CodeTypeID=72
INNER JOIN WorkOrder wo
on wo.OperationDescrID=odex.OperationDescrID    
WHERE wo.WorkOrderID = @WorkOrderID

SELECT SUM(PlannedBatch) / SUM(NominalBlanks * Stacks) as NrOfPallets
FROM (SELECT WO.PlannedBatch, WO.NominalBlanks, ODEP.OperationDescrID, LinePosition, 
  Case when COUNT(*) = 0 then 1
    else COUNT(*)
  end as Stacks
FROM WorkOrder Wo
INNER JOIN ODExitPallet ODEX
ON WO.operationDescrID = ODEX.OperationDescrID
INNER JOIN Stacking ST
ON ST.PalletStackingID = ODEX.PalletStackingID
WHERE WO.WorkOrderID = @WorkOrderID
GROUP BY  PlannedBatch, NominalBlanks, ODEX.OperationDescrID, LinePosition
) TOTAL

所以我想在第一个查询中添加第二个查询作为字段。我用括号和东西之类的东西尝试了它,但我一直在收到错误。有人可以开导我吗?

1 个答案:

答案 0 :(得分:2)

在第二个查询中插入( ),但请确保第二个查询仅返回1行

SELECT od.ODCode
    , c.Description as 'Line Position'
    , ps.Description as 'Pallet Stacking'
    , pt.Description as 'Pallet Type'
    , odex.PalletRows
    , odex.PalletTypeID
    ,CONCAT(
            (
                SELECT sp.SpecPropertyValue 
                FROM SpecificationProperty sp 
                INNER JOIN specificationclass sc ON sc.specclassid = sp.specclassid 
                INNER JOIN specificationcode sco ON sco.specclassid = sc.specclassid and sco.speccodeid = pt.pallettypeid
                INNER JOIN SpecificationClassProperty scp ON scp.specClassid = sp.specclassid and scp.specpropertyid = sp.specpropertyid and sco.speccodeid = sp.speccodeid 
                WHERE scp.specpropertyname  = 'DocDir'and sc.specclassname = 'Pallettypedoc' 
            )
            ,
            (
                SELECT sp.SpecPropertyValue FROM SpecificationProperty sp 
                INNER JOIN specificationclass sc ON sc.specclassid = sp.specclassid 
                INNER JOIN specificationcode sco ON sco.specclassid = sc.specclassid and sco.speccodeid = pt.pallettypeid
                INNER JOIN SpecificationClassProperty scp ON scp.specClassid = sp.specclassid and scp.specpropertyid = sp.specpropertyid and sco.speccodeid = sp.speccodeid 
                WHERE scp.specpropertyname  = 'Documentname'and sc.specclassname = 'Pallettypedoc' 
            )
    ) AS Spec
    ,(
        SELECT SUM(PlannedBatch) / SUM(NominalBlanks * Stacks)
        FROM (
            SELECT WO.PlannedBatch, WO.NominalBlanks, ODEP.OperationDescrID, LinePosition, 
                    Case when COUNT(*) = 0 then 1
                                            else COUNT(*)
                        end as Stacks
                FROM WorkOrder Wo
                    INNER JOIN ODExitPallet ODEX
                            ON WO.operationDescrID = ODEX.OperationDescrID
                    INNER JOIN Stacking ST
                            ON ST.PalletStackingID = ODEX.PalletStackingID
                WHERE WO.WorkOrderID = @WorkOrderID
            GROUP BY  PlannedBatch, NominalBlanks, ODEX.OperationDescrID, LinePosition
        ) TOTAL
    ) AS [NrOfPallets]
FROM ODExitPallet odex
INNER JOIN OperationDescr od ON od.OperationDescrID=odex.OperationDescrID
INNER JOIN PalletStacking ps ON ps.PalletStackingID=odex.PalletStackingID
INNER JOIN PalletType pt ON pt.PalletTypeID=odex.PalletTypeID
INNER JOIN Code c on c.CodeNumber=odex.LinePosition and c.CodeTypeID=72
INNER JOIN WorkOrder wo on wo.OperationDescrID=odex.OperationDescrID
WHERE wo.WorkOrderID = @WorkOrderID