Цвет заливки на основе значений из другого набора данных в SSRS - PullRequest
1 голос
/ 23 июня 2019

Я пытаюсь заполнить цвета на основе записей таблицы.

Из базы данных SQL Server AdventureWorks2017:

          select * from [HumanResources].[Department]

У меня есть два набора данных:

           1st : select * from [HumanResources].[Department]

            DepartmentID                         Name                            GroupName                                          Status
            ----------------------------------------------------------------------------------------------------------------------------------------
            1                                Engineering                    Research and Development                       Cancelled
            2                                Tool Design                    Research and Development                       Blacklist
            3                                Sales                          Sales and Marketing                            Approved
            4                                Marketing                      Sales and Marketing                            All good
            5                                Purchasing                     Inventory Management                           xxx
            6                                Research and Development       Research and Development                       yyy
            7                                Production                     Manufacturing                                  zzz
            8                                Production                     Control Manufacturing                          xxx
            9                                Human Resources                Executive General and Administration           zzz
            10                               Finance                        Executive General and Administration           aaa
            11                               Information Services           Executive General and Administration           xxx
            12                               Document Control               Quality Assurance                              yyy
            13                               Quality Assurance              Quality Assurance                              zzz
            14                               Facilities and Maintenance     Executive General and Administration           aaa
            15                               Shipping and Receiving         Inventory Management                           bbb
            16                               Executive                      Executive General and Administration           aaa

2-й , у меня есть требование получить данные, как показано ниже, и отобразить в отчете SSRS:

                Name0                                Name1                                      Name2                           Name3                                      Name4
            -----------------------------------------------------------------------------------------------------------------------------------------------------------------
            Document Control           Facilities and Maintenance                Information Services           Production Control                  Research and Development
             Engineering                Finance                                     Marketing                      Purchasing                       Sales
             Executive                 Human Resources                             Production                   Quality Assurance                   Shipping and Receiving
              NULL                     NULL                                         NULL                         NULL                               Tool Design

Приведенные выше данные я получаю по следующему запросу:

            WITH Table1 AS
            (
                SELECT  [Name]
                FROM    [HumanResources].[Department]
            ), CTE AS
            (
                SELECT  [Name], COL, ROW_NUMBER() OVER(PARTITION BY Col ORDER BY [Name]) AS Row
                FROM    (   SELECT [Name],
                                    5 - NTILE(5) OVER(ORDER BY [Name] DESC) AS Col
                            FROM Table1  
                        ) c
            )
            SELECT [0], [1], [2], [3], [4]
            FROM CTE 
            PIVOT (MAX([Name]) FOR Col IN ([0], [1], [2], [3], [4])) AS Pvt
            ORDER BY Row;

Кроме того, в дополнение к вышеуказанному требованию, другое требование заключается в заполнении цветов во 2-м наборе результатов на основе значений "GroupName" и "Status", которые являются значениями "другого набора данных"; которым я пользуюсь:

       select * from [HumanResources].[Department]

Я пытаюсь использовать выражения ниже, чтобы заполнить цвета для второго набора данных:

      =IIF(LOOKUP((Fields!ID0.Value or Fields!ID1.Value or Fields!ID2.Value or Fields!ID3.Value or Fields!ID4.Value),Fields!Name.Value,Fields!GroupName.Value="Research and Development","DsetAll"),"GREEN","WHITE") 

      =IIF(LOOKUP((Fields!ID0.Value or Fields!ID1.Value or Fields!ID2.Value or Fields!ID3.Value or Fields!ID4.Value),Fields!Name.Value,Fields!GroupName.Value,"DsetAll")="Research and Development","GREEN","WHITE")

Проблема в том, что ни одно из приведенных выше выражений не работает нормально.

EDIT: Выражение ниже выглядит хорошо работает:

 =IIF(LOOKUP(Fields!ID0.Value ,Fields!Name.Value,Fields!GroupName.Value,"DsetAll")="Research and Development","BLUE","RED")

Похоже, "ИЛИ" внутри "поиска" не работает. Как я могу сделать эту работу? Есть еще способы?

В 2-м наборе результатов , идея сделать:

        if groupname "Research and Development" and status is "Cancelled" then "Green"
       if groupname "Research and Development" and status is "Blacklist" then "Green"
       if groupname "Sales and Marketing" and status is "Approved" then "Green"
                if status is "All good" then Gray
                if groupname "Manufacturing" then Blue
                if groupname "Control   Manufacturing" then red
                if groupname "Executive General and Administration" then pink
                if groupname "Quality Assurance" then Violet
                Else its should be white

1-е выражение не показывает заполненный цвет. Кроме того, значение NULL / Blank не должно иметь цвета.

и второе выражение имеет ошибку:

            The Error occurred during local report processing.
            The definition of the report '/ColorTest' is invalid.
            The BackgroundColor expression for the text box 'ID0' contains an error: [BC30201] Expression expected.

Как мне этого добиться? Или, пожалуйста, дайте мне знать, если есть какие-либо другие способы добиться того же? Спасибо

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Видя, что от Name0 до Name4 в качестве статических столбцов ... вы можете просто присоединить каждый столбец к таблице ресурсов, чтобы получить статус и на основе результата ... вернуть цвет, а затем использовать этот цвет для ячейки в отчет.

Я бы подошел к этому, обернув свой Pivot cte и получив аккуратный вывод ..

Что-то вроде

    , my_pivot_result as (

     SELECT [0], [1], [2], [3], [4]
                FROM CTE 
                PIVOT (MAX([Name]) FOR Col IN ([0], [1], [2], [3], [4])) AS Pvt

    )
,my_status as (

select my_pivot_result .* 
, isnull(col1_name.status,'') as col1_status
, isnull(col1_name.groupname,'') as col1_groupname
, isnull(col2_name.status,'') as col2_status
, isnull(col2_name.groupname,'') as col2_groupname
, isnull(col3_name.status,'') as col3_status
, isnull(col3_name.groupname,'') as col3_groupname
, isnull(col4_name.status,'') as col_status
, isnull(col4_name.groupname,'') as col4_groupname

from my_pivot_result 

left join [HumanResources].[Department] col1_name
 on col1_name.name = my_pivot_result.name0

left join [HumanResources].[Department] col2_name
 on col2_name.name = my_pivot_result.name1

left join [HumanResources].[Department] col3_name
 on col3_name.name = my_pivot_result.name2

left join [HumanResources].[Department] col4_name
 on col4_name.name = my_pivot_result.name3
)

Select * from my_status

теперь для каждой строки у вас должен быть статус и имя группы. Теперь используйте оператор case, чтобы построить другой столбец для цвета.

что-то вроде ..

    case when  col1_groupname = 'Research and Development'
       and col1_status in('Blacklist', 'Cancelled') then 'Green'

 else 'white' end as col1_color

    .
    .
    .

Построение оператора case до тех пор, пока у вас не будут все комбинации

Теперь во внешнем интерфейсе используйте выражение для каждой ячейки, чтобы отобразить цвет, и используйте значение поля цвета.

0 голосов
/ 24 июня 2019

Таким образом выражение должно работать, но я бы рекомендовал использовать другой подход (возможно, использовать вычисляемое поле для хранения конкретной информации в одном поле вместо пяти отдельных полей идентификатора):

=IIF(LOOKUP(Fields!ID0.Value, Fields!Name.Value, Fields!GroupName.Value, "DsetAll") = "Research and Development" Or
     LOOKUP(Fields!ID1.Value, Fields!Name.Value, Fields!GroupName.Value, "DsetAll") = "Research and Development" Or
     LOOKUP(Fields!ID2.Value, Fields!Name.Value, Fields!GroupName.Value, "DsetAll") = "Research and Development" Or
     LOOKUP(Fields!ID3.Value, Fields!Name.Value, Fields!GroupName.Value, "DsetAll") = "Research and Development" Or
     LOOKUP(Fields!ID4.Value, Fields!Name.Value, Fields!GroupName.Value, "DsetAll") = "Research and Development" 
    ,"BLUE"
    ,"RED")
...