1

UI(レポートが表示される前)には、次のようなルックアップ(コンボ)が表示されます

  • (ID = 0)すべての組織単位
  • (ID = 4).HR
  • (ID = 5).DEV

する必要がある:

  1. (0)を選択した場合、(4)+(5)のデータを表示できます。
  2. HRまたはDEVのいずれかが選択されている場合のみ、(4)または(5)。

ルックアップコンボコード(選択すると、以下のクエリでパラメータがフィードされます。)


Select 0 AS ID,'All Org' AS Name from  DP_ORG_OrganizationUnit
where DP_ORG_OrganizationUnit.Code IN {AccessData}
Union
SELECT 
DP_ORG_OrganizationUnit.ID,
DP_ORG_OrganizationUnit.Name
FROM DP_ORG_OrganizationUnit  where DP_ORG_OrganizationUnit.Code IN ('HR','DEV')


レポートデータ行クエリ


SET CONCAT_NULL_YIELDS_NULL OFF

DECLARE @EmpID as int; 
DECLARE @OrganizationUnit as int; 
DECLARE @StartDate as datetime;
DECLARE @EndDate as datetime;

SET @EmpID = ?;
SET @StartDate = ?;
SET @EndDate = ?;
SET @OrganizationUnit = ?;

SELECT
Employee.Code,
Employee.Name1+' '+Employee.Name2+' '+Employee.Name3+' '+Employee.Name4+' '+Employee.Name5 AS FullName,
Employee.OrganizationUnit,  
ContractType.Name,
EmployeeContract.StartDate,
EmployeeContract.EndDate
FROM Employee INNER JOIN (ContractType INNER JOIN EmployeeContract 
ON ContractType.ID = EmployeeContract.ContractType) 
ON Employee.ID = EmployeeContract.Employee
WHERE (Employee.ID = @EmpID  OR  @EmpID=0)
AND
(Employee.OrganizationUnit = @OrganizationUnit  OR  @OrganizationUnit=0)
AND  NOT((EndDate <  @StartDate or StartDate > @EndDate)); 

見た目からそれを達成する方法はありますか?0 = 0は、他の部門からのすべてのデータも表示します。

誰か:-o?

4

5 に答える 5

2

まず、ルックアップコンボコードを少し厳しくすることができます。

-- the FROM clause was superfluous
SELECT 0 AS ID,'All Org' AS Name 
UNION ALL
-- the two-part identifiers were superfluous (only one table)
SELECT ID, Name
FROM DP_ORG_OrganizationUnit
WHERE Code IN ('HR','DEV')

レポートクエリの場合、最も単純な形式は次のとおりです。

WHERE 
  ((@OrganizationUnit > 0 AND Employee.OrganizationUnit = @OrganizationUnit) OR 
   (@OrganizationUnit = 0 AND Employee.OrganizationUnit IN (4,5)))
于 2009-06-08T23:46:54.340 に答える
0

このようなものが機能するはずです

Where (Employee.OrganizationUnit = case when @OrganizationUnit=0 then 4 else @OrganizationUnit end OR case when @OrganizationUnit=0 then 5 else @OrganizationUnit end)
于 2009-06-08T14:44:06.577 に答える
0

どうですか

WHERE (Employee.ID = @EmpID  OR  @EmpID=0)
AND
(Employee.OrganizationUnit BETWEEN ISNULL(NULLIF(@OrganizationUnit,0),0) AND ISNULL(NULLIF(@OrganizationUnit,0),99))
AND  NOT((EndDate <  @StartDate or StartDate > @EndDate));
于 2009-06-08T14:51:20.900 に答える
0

これを試してください。クエリでインデックスを使用する必要があります...

DECALRE @FilterValues (FilterValue   int not null primary key)

IF @Param=0
BEGIN
    INSERT INTO @FilterValues VALUES (4)
    INSERT INTO @FilterValues VALUES (5)
END
ELSE ID @PAram IS NOT NULL
BEGIN
    INSERT INTO @FilterValues VALUES (@Param)
END

SELECT
    ....
    FROM YourTable                y
        INNER JOIN @FilterValues  f ON y.Value=f.Value
    WHERE .....
于 2009-06-08T15:10:30.440 に答える
0

KMのバージョンは機能しますが、このクエリには一時テーブルは必要ありません...

SELECT *
FROM Employee
WHERE (
         @OrganizationUnit = 0
         OR 
         (
             @OrganizationUnit <> 0
             AND
             Employee.OrganizationUnit = @OrganizationUnit
         )
      )
于 2009-06-09T00:22:40.587 に答える