0

我能够在 SSRS 中填充一个参数下拉列表,该下拉列表从数据集中获取活动列表。虽然我遇到的问题是在数据中有一个 activitylabel 字段,它只包含在 dimact 表中,并且当任何活动的标签值为“versional”时,我想要一个 case 语句将其替换为父活动的名称默认子活动名称。连接数据的字段是 activity_pk 和 activityfk,获得正确父项的字段是 prntactfk。下面是一个数据示例,我希望 2 个测试课程行与下拉列表中查询中使用的 DISTINCT 合并。

Example Data: (Name - Label) 
CourseA-Course (Not Versional so leave alone) 
Test Course-Versional  (Parent is Test Course Parent) 
Test Course (1.1)-Versional (Parent is Test Course Parent) 
CourseB-Document (Not Versional so leave alone)

在不使用 dimact1.ActivityLabel = 'Versional 的情况下在 SQL 中工作的查询:

SELECT DISTINCT act1.activityname
FROM  act1
INNER JOIN dimact1 on dimact1.ActivityFK = act1.Activity_PK
WHERE 
CASE 
        WHEN dimact1.ActivityLabel = 'Versional' 
        AND EXISTS (
            SELECT dimact2.PrntActFK
                FROM dimact2
        WHERE dimact2.activitylabel = 'Versional'
        AND dimact2.PrntActFK = act1.Activity_PK
    ) THEN 1
END = 1
ORDER BY act1.activityname ASC
4

1 回答 1

0

通常在这种情况下LEFT JOIN,父表会使用CASEorCOALESCE在父值和子值之间进行选择。

所以对于像这样的数据:

create table Courses
(
  ID int
  , name varchar(100)
  , label varchar(100)
  , parentID int
)

insert into Courses
values
(1,'Test Course Parent','Test Course Parent',null)
, (2,'CourseA','Course',null)
, (3,'CourseB','Document',null)
, (4,'Test Course','Versional',1)
, (5,'Test Course (1.1)','Versional',1)

您可以使用如下查询:

select distinct case when c.Label = 'Versional' then p.name
  else c.name
  end as name
from Courses c
  left join Courses p on c.parentID = p.ID

SQL Fiddle 与演示

希望这能让你走上正确的轨道。我承认我发现您的示例有点难以理解,因此如果您需要更多信息,请提供一些示例数据和您需要的结果。

于 2013-05-10T23:05:09.180 回答