2016-04-27 10 views
0

comboboxを使用してdatagridviewでフィルタを作成しようとしました。 私がしたかったのは、datagridviewのフィルタリングされたデータをフィルタリングすることでした。 私は7つの濾過のためにcomboboxesを持っています。たとえば、最初のcomboboxが今年の場合は、検索をグレードレベル、次にセクションなどにフィルタリングしたいと考えています。したがって、ユーザーはデータベースからの検索をソートまたはフィルタリングできます。SQL Serverから年齢をフィルタする方法

これまでのストアドプロシージャコードをコンボボックスで試しました。データベースから保存せずに自動的に年齢を計算するように年齢を除いてクエリを設定しましたが、今では年齢をフィルタリングすることが問題になります。

私はこの方法でストアドプロシージャを実行しました。

ALTER PROCEDURE [dbo].[uspYearGradeFilter] 
    @Year Nvarchar(20) = NULL, 
    @Grade Nvarchar(20) = NULL, 
    @Section Nvarchar(20) = NUll, 
    @Gender Nvarchar(20) = NULL, 
    @Status Nvarchar(20) = NULL, 
    @Status2 Nvarchar(20) = NULL, 
    @Age Nvarchar(20) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     si.StudentID, SI.Surname, SI.FirstName, SI.MiddleName, 
     si.Gender, si.BirthDay, SI.TelNum, 
     Birthday, getdate() AS [Today], 
     Datediff(yy, BirthDay, getdate()) - 
      CASE 
       WHEN DATEADD(YY, DATEDIFF(YY, BirthDay, getdate()), BirthDay) > GETDATE() 
        THEN 1 
        ELSE 0 
      END AS [age] 
    FROM 
     StudentInformation SI 
    JOIN 
     StudentHistory SH ON SI.StudentID = SH.StudentID 
    WHERE 
     sh.SchoolYear LIKE COALESCE('%'+ @Year+'%', sh.SchoolYear) 
     AND sh.Levels LIKE COALESCE('%' + @Grade + '%', sh.Levels) 
     AND SI.Gender LIKE COALESCE('%' + @Gender + '%', si.gender) 
     AND SH.Section LIKE COALESCE('%' + @Section + '%', sh.Section) 
     AND Si.Status LIKE COALESCE('%' + @Status + '%', si.status) 
     AND Sh.Status2 LIKE COALESCE(@Status2 + '%', sh.status2) 
     AND [Age] LIKE COALESCE('%' + @Age + '%', [Age]) 
END 

しかし、私はエラーを取得する:

Msg 207, Level 16, State 1, Procedure uspYearGradeFilter, Line 42
Invalid column name 'Age'

誰かがこれを解決するために私を助けてくださいことはできますか?ありがとう

+0

サイドノート:**なぜ私は '@年 'のような' nvarchar(20) 'を使っていますか?数値? *最も適切な*データ型を常に使用してください - 数字の型、日付と時刻の型の型を使用してください。 –

+0

@marc_s - 現代的なスタイルは、すべての変数が文字列として宣言されていて、それが使用されるときはいつでも '.ToString()'を持っていますか? – Hogan

答えて

2

即時WHERE句で列エイリアスを使用することはできません。あなたはサブクエリーでそれを使用することができます:

SELECT * FROM 
(
    SELECT 
     si.StudentID, 
     SI.Surname, 
     SI.FirstName, 
     SI.MiddleName, 
     si.Gender, 
     si.BirthDay, 
     SI.TelNum 
     getdate() AS [Today], 
     Datediff(yy,BirthDay,getdate()) - 
        CASE 
         WHEN DATEADD(YY, DATEDIFF(YY,BirthDay,getdate()),BirthDay) > GETDATE() 
          THEN 1 
         ELSE 
          0 
        END AS [age] 
    FROM StudentInformation SI 
    JOIN StudentHistory SH 
     ON SI.StudentID = SH.StudentID 
    WHERE 
     sh.SchoolYear LIKE COALESCE('%'+ @Year+'%', sh.SchoolYear) 
     AND sh.Levels LIKE COALESCE('%' + @Grade + '%', sh.Levels) 
     AND SI.Gender LIKE COALESCE('%' + @Gender + '%', si.gender) 
     AND SH.Section LIKE COALESCE('%' + @Section + '%', sh.Section) 
     AND Si.Status LIKE COALESCE('%' + @Status + '%', si.status) 
     AND Sh.Status2 LIKE COALESCE(@Status2 + '%', sh.status2) 
) t 
WHERE [Age] LIKE COALESCE('%' + @Age + '%', [Age]) 
+0

こんにちはフェリックス、私はあなたのコードを試したときにエラーが発生しました。 '列' Birthday 'は' t 'に複数回指定されています。 ' –

+0

サブクエリの2番目の誕生日を削除します。 –

+0

フェリックスに感謝、それは完璧に動作します:-) –

関連する問題