0
WITH
EmpDetails(EmpCode)
AS
(
 SELECT EmpCode 
 FROM Employee.tblEmp_Demographics 
 WHERE RecordStatus='present' 
)  

    select *,ROW_NUMBER() OVER (PARTITION BY EmpCode ORDER BY DateTaken DESC) AS RowNum,    
    (select GradeName From Master.GradeMaster where GradeCode=Grade And Deleted=0) As Grade,    
    SUM(Amount) OVER(PARTITION BY Grade) AS EmpAmount,
    SUM(DependentAmount) OVER(PARTITION BY Grade) As DepAmount,
    0 As CheckNo 
    from [dbo].[SELECT_AIRTICKET_DETAILS_BY_DATE](EmpDetails.EmpCode,getdate(),1) WHERE YEAR(DateTaken)=year(getdate())

しかし、私はエラーが発生します

メッセージ 4104、レベル 16、状態 1、行 11 マルチパート識別子「EmpDetails.EmpCode」をバインドできませんでした。

4

1 に答える 1

0

この問題はEmpDetails.EmpCode、単一の値ではなく、テーブル値関数に列名を渡した結果だと思います。代わりにこれを試すことができます:

DECLARE @EmpCode nvarchar(100);

SELECT TOP 1
       @EmpCode = EmpCode 
  FROM Employee.tblEmp_Demographics
 WHERE RecordStatus='present';

select *,ROW_NUMBER() OVER (PARTITION BY EmpCode ORDER BY DateTaken DESC) AS RowNum,    
(select GradeName From Master.GradeMaster where GradeCode=Grade And Deleted=0) As Grade,    
SUM(Amount) OVER(PARTITION BY Grade) AS EmpAmount,
SUM(DependentAmount) OVER(PARTITION BY Grade) As DepAmount,
0 As CheckNo 
from [dbo].[SELECT_AIRTICKET_DETAILS_BY_DATE](@EmpCode,getdate(),1) WHERE YEAR(DateTaken)=year(getdate());

テーブルから複数の値の結果が必要な場合は、Employee.tblEmp_Demographics各値を反復処理するか(おそらく最適ではない)、テーブル値関数を変更してすべてのEmpCode値を含む結果セットを返しWHERE、データを次のようにフィルタリングする句を追加します。必要です。


編集

このようなものはおそらく-すべてのEmpCodesを返し、パラメータが1つ少ない変更された関数に注意してください。

select *,ROW_NUMBER() OVER (PARTITION BY EmpCode ORDER BY DateTaken DESC) AS RowNum,    
(select GradeName From Master.GradeMaster where GradeCode=Grade And Deleted=0) As Grade,    
SUM(Amount) OVER(PARTITION BY Grade) AS EmpAmount,
SUM(DependentAmount) OVER(PARTITION BY Grade) As DepAmount,
0 As CheckNo 
  FROM [dbo].[SELECT_AIRTICKET_DETAILS_BY_DATE](getdate(),1) AS [Tickets]
 INNER JOIN Employee.tblEmp_Demographics
         ON tblEmp_Demographics.EmpCode = [Tickets].EmpCode
        AND tblEmp_Demographics.RecordStatus = 'present'
 WHERE YEAR(DateTaken) = year(getdate());

INNER JOINこのソリューションでは、関数はすべてのEmpCodeを返しますが、テーブルでを実行することにより、不要なものを除外しEmployee.tblEmp_Demographicsます。

于 2012-11-06T07:26:52.720 に答える