﻿<?xml version="1.0" encoding="utf-8"?>
<ReportsExport>
  <Reports>
    <Report id="87f5cb2c-2e9a-4c87-8e19-406670a36a23" codekey="Nutzungsvergleich_Lernprogramme" categoryCodekey="LearningPrograms" name="Nutzungsvergleich Lernprogramme" description="Der Report ermöglicht einen Vergleich zur Nutzung von n auszuwählenden Lernprogrammen für m auszuwählende Zielgruppen und jeweils eine Teilmenge der Zielgruppen die auf Basis eines Userattributes &quot;VVID&quot; und &quot;sammelt Kodex Punkte&quot; ermittelt wird.">
      <MetaData created="2016-12-07T11:09:00" createdBy="Administrator VIWIS (Administrator)" createdBy_user_id="272" />
      <ExecutionDetails format="TableResult" commandType="SqlCommandOrQuery" exportHandler="" adminControl="" exportMultipleTablesToSheets="False" datesWithTime="False" extraParams="" />
      <Mandators mandatorMode="OnlyOwner" mandator_id="de036d2c-7313-4d05-8de1-4648ba51a4d3" mandatorName="ERGO_e-Campus" isStandard="False" isUsedByMenu="False" />
      <Parameters>
        <Parameter id="bf72399d-7582-4b2a-a06c-8d47afe576f2" isRequired="False" allowMultiSelect="False" name="Von" contextName="Von" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="80245dc5-ca96-4c76-9449-2b5d07b129e9" isRequired="False" allowMultiSelect="False" name="Bis" contextName="Bis" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="20B1DFB0-DEB7-4546-93CB-EC71A6C26FB9" isRequired="False" allowMultiSelect="True" name="Auswahl Zielgruppe" contextName="Zielgruppe" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
        <Parameter id="2A06DF59-9B0B-4BFF-AA28-45C030CD4FC2" isRequired="False" allowMultiSelect="True" name="Auswahl Lernprogramme" contextName="Lernprogramme" defaultValue="" renderHint="Undefined" disableParameter="DontDisable" />
      </Parameters>
      <Roles />
      <command>
-- --------------------------------------------------------------------------------
-- DEBUG START --------------------------------------------------------------------
-- declare @SelectedTargetGroups  [dbo].[typeIntList];
-- declare @SelectedLearningPrograms [dbo].[typeGuidList]
-- declare @StartDate DATE
-- declare @EndDate DATE

-- -- DEBUG: Insert some test target groups
-- INSERT INTO
--     @SelectedTargetGroups
-- SELECT
--     [id]
-- FROM
--     [dbo].[tblTargetGroups]
-- WHERE
--     title IN (
--     'Bibliothek')

-- INSERT INTO
--     @SelectedTargetGroups
-- SELECT
--     [id]
-- FROM
--     [dbo].[tblTargetGroups]
-- WHERE
--     title IN (
--     'Z_ERGO Vertrieb Gesamt ohne ERGO Pro SV')

-- -- DEBUG: Insert some test learning programs
-- INSERT INTO
--     @SelectedLearningPrograms
-- SELECT
--     t.[id]
-- FROM
--     [dbo].[tblThemes] t
--     INNER JOIN tblItems i
--         ON i.id = t.id
-- WHERE
--     i.title IN (
--         'BU Grundlagen',
--         'Erfolgreich Lernen non PHP')
--     AND i.deleted IS NULL

--SET @StartDate = '2015-07-01';
-- DEBUG END ----------------------------------------------------------------------
-- --------------------------------------------------------------------------------

SET NOCOUNT ON;

-- Ensure that we have valid dates for our date boundaries as BETWEEN doesn't cope with NULL
SET @StartDate = ISNULL(@StartDate, '1900-01-01');
SET @EndDate = ISNULL(@EndDate, DATEADD(d, 1, GETDATE()));

-- As a decimal to simplify keeping fractions in division operations later
DECLARE @TotalLearningPrograms DECIMAL(10,2);
SELECT
    @TotalLearningPrograms = COUNT(*)
FROM
    @SelectedLearningPrograms

-- NOTE: This is a temp table as it needs to be referenced later in dynamic SQL
CREATE TABLE #TargetGroupsToInclude (
    TargetGroupId INT,
    Title VARCHAR(2048),
    IsTeilZwei BIT,
    TotalUserCount INT,
    TotalUserCountAtLeastOneTheme INT,
    PRIMARY KEY (TargetGroupId, IsTeilZwei)
)

-- This will be the definitive join table between target groups and users
-- as there are numerous conditions on this
DECLARE @TargetGroupUsers TABLE(
    TargetGroupId INT,
    UserId INT,
    IsTeilZwei BIT
    PRIMARY KEY (TargetGroupId, UserId)
)

-- Create our reference list of users we're interested in and the relevant target group
INSERT INTO
    @TargetGroupUsers
SELECT
    sutg.targetGroup_id,
    u.intUserCn,
    CASE
        -- User has a register number (VermittlerID) OR Sammelt Kodex Punkte custom attribute is set
        WHEN
            ISNULL(u.registernumber, '') != ''
            OR ca.customAttribute3 = '1'
        THEN 1
        ELSE 0
    END
FROM
    @SelectedTargetGroups stg
    INNER JOIN
    (
        -- Only users who were assigned to target groups at some time during the selected period
        SELECT DISTINCT
            user_id, targetGroup_id
        FROM
            [tblStatsUsersTargetGroups]
        WHERE
            addedTime &lt; @EndDate
            AND ISNULL(removedTime, @EndDate) &gt;= @EndDate
    ) sutg
        ON sutg.targetGroup_id = stg.value
    INNER JOIN [v_Users] u
        ON u.intUserCn = sutg.[user_id]
        AND u.deleted IS NULL
    LEFT JOIN [tblUserCustomAttributes] ca
        ON ca.user_id = u.intUserCn

-- First add all the target groups the user selected  (Teil 1)
INSERT INTO
    #TargetGroupsToInclude
SELECT
    tgu.TargetGroupId, tg.Title, 0, count(tgu.UserId), 0
FROM
    @TargetGroupUsers tgu
    INNER JOIN tblTargetGroups tg
        ON tg.id = tgu.TargetGroupId
GROUP BY
    tgu.TargetGroupId, tg.Title

-- Add users of target groups from Teil 1 with some extra conditions (Teil 2)
INSERT INTO
    #TargetGroupsToInclude
SELECT
    tgu.TargetGroupId, tg.Title + ' (Kodex/VVID)', 1, count(tgu.UserId), 0
FROM
    @TargetGroupUsers tgu
    INNER JOIN tblTargetGroups tg
        ON tg.id = tgu.TargetGroupId
WHERE
    tgu.IsTeilZwei = 1
GROUP BY
    tgu.TargetGroupId, tg.Title

-- Remove any target groups with less than 5 users in total
DELETE
FROM
    #TargetGroupsToInclude
WHERE
    TotalUserCount &lt; 5

-- Put our theme session results into a table variable to avoid querying it multiple times
DECLARE @UserThemeSessions TABLE
(
    UserId INT,
    ThemeId UNIQUEIDENTIFIER,
    TargetGroupId INT,
    IsTeilZwei BIT,
    DurationSeconds INT
)

INSERT INTO
    @UserThemeSessions
SELECT
    sts.[user_id], sts.theme_id, tgu.TargetGroupId, tgu.IsTeilZwei, sts.durationSeconds
FROM
    [dbo].[tblStatsThemeSessions] sts
    INNER JOIN @SelectedLearningPrograms slp
        ON slp.value = sts.theme_id
    INNER JOIN @TargetGroupUsers tgu
        ON tgu.UserId = sts.[user_id]
WHERE
    sts.startTime BETWEEN @StartDate AND @EndDate


-- For the themes and target groups we're interested in get the total duration per user / theme in minutes
-- NOTE: This is a temp table as it needs to be referenced later in dynamic SQL
CREATE TABLE #UserThemeDuration (
    UserId INT,
    TargetGroupId INT,
    ThemeId UNIQUEIDENTIFIER,
    IsTeilZwei BIT,
    TotalDurationMinutes INT
)

INSERT INTO
    #UserThemeDuration
SELECT
    UserId
    , TargetGroupId
    , ThemeId
    , IsTeilZwei
    , ROUND(SUM(DurationSeconds) / CAST(60 as DECIMAL(10,2)), 0)
FROM
    @UserThemeSessions
GROUP BY
    UserId, TargetGroupId, ThemeId, IsTeilZwei


-- Update the "participated in at least one learning program" user count
-- First add the count of Teil 2 users to both matching target groups as
-- Teil 2 is a subset of Teil 1
UPDATE
    tgi
SET
    TotalUserCountAtLeastOneTheme = tgTotals.Total
FROM
    #TargetGroupsToInclude tgi
    INNER JOIN
    (
        SELECT
            tgu.TargetGroupId, COUNT(tgu.UserId) as Total
        FROM
            (
                -- DISTINCT to prevent users who participated in multiple themes for the same target group being counted multiple times
                SELECT DISTINCT
                    TargetGroupId, UserId, IsTeilZwei
                FROM
                    #UserThemeDuration
            ) AS tgu
        WHERE
            tgu.IsTeilZwei = 1
        GROUP BY
            tgu.TargetGroupId
    ) AS tgTotals
        ON  tgTotals.TargetGroupId = tgi.TargetGroupId

-- Now only for the Teil 1 target groups add the total of users who are not Teil 2
UPDATE
    tgi
SET
    TotalUserCountAtLeastOneTheme = TotalUserCountAtLeastOneTheme + tgTotals.Total
FROM
    #TargetGroupsToInclude tgi
    INNER JOIN
    (
        SELECT
            tgu.TargetGroupId, COUNT(tgu.UserId) as Total
        FROM
            (
                -- DISTINCT to prevent users who participated in multiple themes for the same target group being counted multiple times
                SELECT DISTINCT
                    TargetGroupId, UserId, IsTeilZwei
                FROM
                    #UserThemeDuration
            ) AS tgu
        WHERE
            tgu.IsTeilZwei = 0
        GROUP BY
            tgu.TargetGroupId
    ) AS tgTotals
        ON  tgTotals.TargetGroupId = tgi.TargetGroupId
WHERE
    tgi.IsTeilZwei = 0


-- Create a table to track for a given Target Group the average number of users per Learning Program
-- NOTE: This is a temp table as it needs to be referenced later in dynamic SQL
CREATE TABLE #TargetGroupAvgUsersPerLearningProgram (
    TargetGroupId INT,
    IsTeilZwei BIT,
    AverageUsers DECIMAL(10,2)
)

INSERT INTO
    #TargetGroupAvgUsersPerLearningProgram
SELECT
    TargetGroupId, 0, ROUND(COUNT(UserId)  / @TotalLearningPrograms, 2)
FROM
    #UserThemeDuration
GROUP BY
    TargetGroupId

INSERT INTO
    #TargetGroupAvgUsersPerLearningProgram
SELECT
    TargetGroupId, 1, ROUND(COUNT(UserId)  / @TotalLearningPrograms, 2)
FROM
    #UserThemeDuration
WHERE
    IsTeilZwei = 1
GROUP BY
    TargetGroupId


-- Create a table to track for a given Target Group the average number of users per Learning Program
-- NOTE: This is a temp table as it needs to be referenced later in dynamic SQL
CREATE TABLE #TargetGroupAvgDuration (
    TargetGroupId INT,
    IsTeilZwei BIT,
    AverageDuration INT
)

INSERT INTO
    #TargetGroupAvgDuration
SELECT
    TargetGroupId, 0, ROUND(AVG(TotalDurationMinutes), 0)
FROM
    #UserThemeDuration
GROUP BY
    TargetGroupId

INSERT INTO
    #TargetGroupAvgDuration
SELECT
    TargetGroupId, 1, ROUND(AVG(TotalDurationMinutes), 0)
FROM
    #UserThemeDuration
WHERE
    IsTeilZwei = 1
GROUP BY
    TargetGroupId


-- Get the count of users who completed each learning program within the specified date range
DECLARE @SuccessfulUsers TABLE
(
    UserId INT,
    TargetGroupId INT,
    ThemeId UNIQUEIDENTIFIER,
    IsTeilZwei BIT
)

INSERT INTO
    @SuccessfulUsers
SELECT
    utd.UserId, utd.TargetGroupId, utd.ThemeId, utd.IsTeilZwei
FROM
    [dbo].[tblStatusUserItemHistory] suih
    INNER JOIN #UserThemeDuration utd
        ON  utd.UserId = suih.[user_id]
        AND utd.ThemeId = suih.item_id
WHERE
    suih.[status] = 2 -- Passed
    AND suih.startDate &gt;= @StartDate
    AND
    (
        suih.endDate IS NULL
        OR  suih.endDate &lt;= @EndDate
    )

CREATE TABLE #SuccessfulQuota
(
    TargetGroupId INT,
    ThemeId UNIQUEIDENTIFIER,
    IsTeilZwei BIT,
    Quota INT
)

-- Add Teil 1 Quota (which includes Teil 2)
INSERT INTO
    #SuccessfulQuota
SELECT
    su.TargetGroupId, su.ThemeId, 0, (COUNT(su.UserId) / CAST(tu.TotalUserCount AS DECIMAL(10,2))) * 100
FROM
    @SuccessfulUsers su
    INNER JOIN
    (
        -- Same query as for the duration but not grouped on user
        SELECT
            TargetGroupId, ThemeId, COUNT(UserId) as TotalUserCount
        FROM
            @UserThemeSessions
        GROUP BY
            TargetGroupId, ThemeId
    ) tu
        ON  tu.TargetGroupId = su.TargetGroupId
        AND tu.ThemeId = su.ThemeId
GROUP BY
    su.TargetGroupId, su.ThemeId, tu.TotalUserCount

-- Now add the Teil 2 Quota separately
INSERT INTO
    #SuccessfulQuota
SELECT
    su.TargetGroupId, su.ThemeId, 1, (COUNT(su.UserId) / CAST(tu.TotalUserCount AS DECIMAL(10,2))) * 100
FROM
    @SuccessfulUsers su
    INNER JOIN
    (
        -- Same query as for the duration but not grouped on user
        SELECT
            TargetGroupId, ThemeId, COUNT(UserId) as TotalUserCount
        FROM
            @UserThemeSessions
        WHERE
            IsTeilZwei = 1
        GROUP BY
            TargetGroupId, ThemeId
    ) tu
        ON  tu.TargetGroupId = su.TargetGroupId
        AND tu.ThemeId = su.ThemeId
WHERE
    su.IsTeilZwei = 1
GROUP BY
    su.TargetGroupId, su.ThemeId, tu.TotalUserCount


-- Start the dynamic pivot madness
DECLARE @columns AS NVARCHAR(MAX),
    @columnsWithAlias AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

-- The set of quoted theme id values for our dynamic pivot
SET @columns = STUFF
(
    (
        SELECT DISTINCT
            ',' + QUOTENAME(value)
        FROM
            @SelectedLearningPrograms

        FOR XML
            PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,1
    ,''
)

-- Replace NULL values and change the titles as requested
SET @columnsWithAlias = STUFF
(
    (
        SELECT DISTINCT
            ',ISNULL(' + QUOTENAME(i.id) + ', 0) AS ''' + 'Anzahl der tatsächlichen Nutzer von ' + REPLACE(i.title, '''', '''''') + ''''
        FROM
            @SelectedLearningPrograms slp
            INNER JOIN tblItems as i
                ON i.id = slp.value
        FOR XML
            PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,1
    ,''
)

-- Dynamic query for Result 1 "Nutzerzahlen"
set @query = '
SET NOCOUNT ON;
SELECT
    Title AS Nutzergruppe, tuc as ''Anzahl User in der Zielgruppe'', tucot AS ''Anzahl der tatsächlichen Nutzer mindestens eines Lernprogrammes'',
    ' + @columnsWithAlias + ',
    (
        SELECT TOP 1
            AverageUsers
        FROM
            #TargetGroupAvgUsersPerLearningProgram
        WHERE
            TargetGroupId = pvt.TargetGroupId
            AND IsTeilZwei = pvt.IsTeilZwei
    ) AS ''Durchschnittliche Anzahl tatsächlicher Nutzer je WBT''
FROM
    (
        SELECT
            UserId,
            ThemeId,
            tgi.TargetGroupId,
            tgi.Title,
            tgi.IsTeilZwei,
            tgi.TotalUserCount AS tuc,
            tgi.TotalUserCountAtLeastOneTheme AS tucot
        FROM
            #UserThemeDuration utd
            INNER JOIN #TargetGroupsToInclude tgi
                ON tgi.TargetGroupId = utd.TargetGroupId
        WHERE
            tgi.IsTeilZwei = 0

        UNION ALL

        SELECT
            UserId,
            ThemeId,
            tgi.TargetGroupId,
            tgi.Title,
            tgi.IsTeilZwei,
            tgi.TotalUserCount AS tuc,
            tgi.TotalUserCountAtLeastOneTheme AS tucot
        FROM
            #UserThemeDuration utd
            INNER JOIN #TargetGroupsToInclude tgi
                ON tgi.TargetGroupId = utd.TargetGroupId
        WHERE
            tgi.IsTeilZwei = 1
            AND utd.IsTeilZwei = 1
    ) as whatever
    PIVOT
    (
        COUNT(UserId)
        FOR ThemeId IN (' + @columns + ')
    ) as pvt

ORDER BY
    pvt.IsTeilZwei, pvt.Title'

-- print '
-- SQL for Query Part 1:
-- ' + @query;
execute(@query)



-- Replace NULL values and change the titles as requested
SET @columnsWithAlias = STUFF
(
    (
        SELECT DISTINCT
            ',ISNULL(' + QUOTENAME(i.id) + ', 0) AS ''' + 'Verweildauer im Schnitt in min pro ' + REPLACE(i.title, '''', '''''') + ' der tatsächlichen Nutzer'''
        FROM
            @SelectedLearningPrograms slp
            INNER JOIN tblItems as i
                ON i.id = slp.value
        FOR XML
            PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,1
    ,''
)

-- Dynamic Query for Result 2 "Verweildauer"
set @query = '
SET NOCOUNT ON;
SELECT
    Title AS Nutzergruppe, tuc as ''Anzahl User in der Zielgruppe'', tucot AS ''Anzahl der tatsächlichen Nutzer mindestens eines Lernprogrammes'',
    ' + @columnsWithAlias + ',
    (
        SELECT TOP 1
            AverageDuration
        FROM
            #TargetGroupAvgDuration
        WHERE
            TargetGroupId = pvt.TargetGroupId
            AND IsTeilZwei = pvt.IsTeilZwei
    ) AS ''Mittlere Verweildauer in allen WBTs (in Min.)''
FROM
    (
        SELECT
            ThemeId,
            utd.TotalDurationMinutes,
            tgi.TargetGroupId,
            tgi.Title,
            tgi.IsTeilZwei,
            tgi.TotalUserCount AS tuc,
            tgi.TotalUserCountAtLeastOneTheme AS tucot
        FROM
            #UserThemeDuration utd
            INNER JOIN #TargetGroupsToInclude tgi
                ON tgi.TargetGroupId = utd.TargetGroupId
        WHERE
            tgi.IsTeilZwei = 0

        UNION ALL

        SELECT
            ThemeId,
            utd.TotalDurationMinutes,
            tgi.TargetGroupId,
            tgi.Title,
            tgi.IsTeilZwei,
            tgi.TotalUserCount AS tuc,
            tgi.TotalUserCountAtLeastOneTheme AS tucot
        FROM
            #UserThemeDuration utd
            INNER JOIN #TargetGroupsToInclude tgi
                ON tgi.TargetGroupId = utd.TargetGroupId
        WHERE
            tgi.IsTeilZwei = 1
            AND utd.IsTeilZwei = 1
    ) as whocares
    PIVOT
    (
        AVG(TotalDurationMinutes)
        FOR ThemeId IN (' + @columns + ')
    ) as pvt
ORDER BY
    pvt.IsTeilZwei, pvt.Title'

 --print '
 --SQL for Query Part 2:
 --' + @query;
execute(@query)


-- Replace NULL values and change the titles as requested
SET @columnsWithAlias = STUFF
(
    (
        SELECT DISTINCT
            ',ISNULL(' + QUOTENAME(i.id) + ', 0) AS ''' + 'Bearbeitungsstand completed in % pro ' + REPLACE(i.title, '''', '''''') + ''''
        FROM
            @SelectedLearningPrograms slp
            INNER JOIN tblItems as i
                ON i.id = slp.value
        FOR XML
            PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,1
    ,''
)

-- Dynamic Query for Result 2 "Verweildauer"
set @query = '
SET NOCOUNT ON;
SELECT
    Title AS Nutzergruppe, tuc as ''Anzahl User in der Zielgruppe'', tucot AS ''Anzahl der tatsächlichen Nutzer mindestens eines Lernprogrammes'', ' + @columnsWithAlias + '
FROM
    (
        SELECT
            sq.ThemeId,
            sq.Quota,
            tgi.Title,
            tgi.IsTeilZwei,
            tgi.TotalUserCount AS tuc,
            tgi.TotalUserCountAtLeastOneTheme AS tucot
        FROM
            #SuccessfulQuota sq
            INNER JOIN #TargetGroupsToInclude tgi
                ON  tgi.TargetGroupId = sq.TargetGroupId
                AND tgi.IsTeilZwei = sq.IsTeilZwei
    ) as something
    PIVOT
    (
        MAX(Quota) -- Not really maxing this, but need an aggregate operator for the pivot
        FOR ThemeId IN (' + @columns + ')
    ) as pvt
ORDER BY
    pvt.IsTeilZwei, pvt.Title'

-- print '
-- SQL for Query Part 3:
-- ' + @query;
execute(@query)


-- Clean up temp tables
DROP TABLE #TargetGroupsToInclude
DROP TABLE #UserThemeDuration
DROP TABLE #TargetGroupAvgUsersPerLearningProgram;
DROP TABLE #TargetGroupAvgDuration;
DROP TABLE #SuccessfulQuota</command>
    </Report>
  </Reports>
  <Parameters>
    <Parameter id="bf72399d-7582-4b2a-a06c-8d47afe576f2" isSystem="True" name="Von" reportParameterType_id="74253ba7-a386-4620-bff7-b65c16fe1e64" queryParameterName="@StartDate" />
    <Parameter id="80245dc5-ca96-4c76-9449-2b5d07b129e9" isSystem="True" name="Bis" reportParameterType_id="74253ba7-a386-4620-bff7-b65c16fe1e64" queryParameterName="@EndDate" />
    <Parameter id="20B1DFB0-DEB7-4546-93CB-EC71A6C26FB9" isSystem="False" name="Zielgruppen" reportParameterType_id="3D418936-445D-4AF8-BE8F-BAB660EEDBE5" queryParameterName="@SelectedTargetGroups" />
    <Parameter id="2A06DF59-9B0B-4BFF-AA28-45C030CD4FC2" isSystem="False" name="Lernprogramme" reportParameterType_id="12CA97F1-2033-42ED-994E-76F49638B523" queryParameterName="@SelectedLearningPrograms" />
  </Parameters>
  <ParameterTypes>
    <ParameterType id="74253ba7-a386-4620-bff7-b65c16fe1e64" isSystem="True" name="Date" datatype="Date" dataValueField="" dataTextField="" />
    <ParameterType id="3D418936-445D-4AF8-BE8F-BAB660EEDBE5" isSystem="False" name="Zielgruppen" datatype="IntegerDDL" dataValueField="id" dataTextField="title">
      <query>
        SELECT
            tg.[id], tg.[title]
        FROM
            [tblTargetGroups] tg
            INNER JOIN [tblUsersTargetGroups] utg
                ON  utg.targetGroup_id = tg.id
            INNER JOIN [v_Users] u
                ON  u.intUserCn = utg.UserCn
                AND u.deleted IS NULL
        WHERE
            tg.[mandator_id] = @current_mandator_id
        GROUP BY
            tg.[id], tg.[title]
        HAVING
            COUNT(u.intUserCn) &gt; 5
        ORDER BY
            [title]
      </query>
    </ParameterType>
    <ParameterType id="12CA97F1-2033-42ED-994E-76F49638B523" isSystem="False" name="Lernprogramme" datatype="GuidDDL" dataValueField="id" dataTextField="title">
      <query>
        SELECT
          t.[id], i.title
        FROM
          [dbo].[tblThemes] t
          INNER JOIN [dbo].[tblItems] i
            ON  i.id = t.id
        WHERE
          t.mandator_id = @current_mandator_id
        ORDER BY
          i.title
      </query>
    </ParameterType>
  </ParameterTypes>
</ReportsExport>