0

我正在使用 SSRS 报告根据类别获取结果,并将类别值更改为 Yes,No,Not Met 替换为 1 = Yes, 2 = No, 3 = Not Met。查询是,

SELECT (
    CASE
        WHEN    A = '99' or B = '99'    THEN 3
        WHEN    C + D >= 10 THEN 1
        ELSE 2
    END) as Category,

结果是,

             N     %     N    %    N     % 
Not Met      10    11%   5    7%   45    20% 
Yes          4     5%    30   4%   8     6%
No           10    11%   5    7%   45    20% 

如果例如没有找到“未满足”的结果,我想要这样的结果,而不是零。

             N     %     N    %    N     % 
Not Met      0     0%    0    0%   0     0% 
Yes          4     5%    30   4%   8     6%
No           10    11%   5    7%   45    20%

我已经在查询中尝试了左连接,但它会带来额外的记录。如果没有找到“是”、“否”或“未满足”的记录,我有点卡住了,不知道如何获得零“0”结果。我的疑问是,

SELECT (
    CASE
        WHEN    A = '99' or B = '99'    THEN 3
        WHEN    C + D >= 10 THEN 1
        ELSE 2
        END
       ) as Category, [Table A].*, [Table B].*
       FROM Table A inner join Table B on Table A.id = Table B.id
       WHERE
        (
            Condition and Field is not null
        ) 

请帮忙,因为这是我的最后一个项目,我被卡住了。

谢谢。

我的样本数据...

MY SAMPLE DATA

TABLE A
=======  

ID -------REFNO-------BGDATE-------SBRST-------xx   xx ...
--      ---------   --  --          
1209-------23-------09/09/1900-------13-------XX    XX
3453-------12-------14/02/1978-------10-------XX    XX
3476-------56-------02/03/1980-------10 -------XX   XX


TABLE B
=======

ID-------- CITY  -------xx  xx ...    xx
--      --      --  --
1209-------Glasgow-------xx-------X
3453-------Edinburgh-----xx-------X
3476-------Manchester----xx-------X

SELECT
(
CASE
    WHEN BGDATE = '09/09/1900' THEN 3

    --I tried this to get Value 3, if no condition met but no success 
    WHEN NOT EXISTS(BGDATE = '09/09/1900') THEN 3

    WHEN SBRST IN ('11','12') THEN 1
    ELSE 2
    END
) as Category, [Table - A].*, [Table - B].*
 FROM [Table - A] inner join [Table - A] on [Table - A].id = [Table - A].ID

 ----> For Ian <-----This is sample data of my WHERE clause
    WHERE
(   
        (
            SBRST IN ('4','5','6','7','11','12') AND SBRST<>'99
            AND NOT
                (
                    EXTNT IN ('2','3','4','99') OR 
                    HOR IN ('2','99') OR
                    (DATEDIFF(day,CHDATE1,CHENDATE1)>='42')
                )
        )
        AND
        (
            SBRST IS NOT NULL AND
            EXTNT IS NOT NULL AND
            HOR IS NOT NULL
        )
)

order by Category desc

RESULT
======
category----------ID----------REFNO----------BGDATE----------SBRST----------xx
3-----------------1209----------23----------09/09/1900----------13----------XX
2-----------------3453----------12----------14/02/1978----------10----------XX
2-----------------3476----------56----------02/03/1980----------10----------Xx

需要考虑的点:

1)以上是我的样本数据。

2)表A和B在ID上有内连接会带来结果。

3) 根据上述 SELECT 条件填充类别,但问题是,*如果没有条件匹配,则不会填充类别,但我也想要缺少的类别。在这种情况下,它是“1”。

我想要这样的东西。

EXPECTED RESULT
======
category----------ID----------REFNO----------BGDATE----------SBRST----------xx
3-----------------1209----------23----------09/09/1900----------13----------XX
2-----------------3453----------12----------14/02/1978----------10----------XX
2-----------------3476----------56----------02/03/1980----------10----------XX
1-----------------0-------------0-----------NULL----------------0-----------NULL

另一种解决方案可能是,如果我创建另一个包含所有 3 个类别的表,然后使用 RIGHT OUTER JOIN 来获得结果,但我不知道如何?

4

2 回答 2

0

我曾经遇到过这个问题。我通过创建一个临时表并将结果插入到临时表中进行了快速修复,然后检查临时表中是否缺少三个类别中的任何一个,然后在临时表中插入一行,其中包含所需的默认值. 下面是一个示例代码(只是给你一个想法)

SELECT (
    CASE
        WHEN    A = '99' or B = '99'    THEN 3
        WHEN    C + D >= 10 THEN 1
        ELSE 2
        END
       ) as Category, [Table A].*
       INTO #Temp
       FROM [Table A]

IF NOT EXISTS (SELECT 1 FROM #Temp WHERE Category=1)
BEGIN
    INSERT INTO #Temp (Category,column1,column2,column3,etc...) VALUES ( 1,0,0,0,etc...
    )
END
IF NOT EXISTS (SELECT 1 FROM #Temp WHERE Category=2)
BEGIN
    INSERT INTO #Temp (Category,column1,column2,column3,etc...) VALUES ( 2,0,0,0,etc...
    )
END
IF NOT EXISTS (SELECT 1 FROM #Temp WHERE Category=3)
BEGIN
    INSERT INTO #Temp (Category,column1,column2,column3,etc...) VALUES ( 3,0,0,0,etc...
    )
END

SELECT * FROM #Temp 

DROP TABLE #temp
于 2013-11-06T00:30:32.723 回答
0

您可以使用类似这样的查询:

select cat.Category
  , a.ID
  , b.CITY
  , a.BGDATE
  , a.REFNO
  , a.SBRST
from
  (
    select Category = 1
    union all
    select Category = 2
    union all
    select Category = 3
  ) cat
  left join
  (
    [Table - A] a
      inner join [Table - B] b on a.ID = b.ID
      cross apply
      (
        SELECT Category = CASE WHEN a.BGDATE = '09/09/1900' THEN 3
          WHEN a.SBRST IN ('11','12') THEN 1
          ELSE 2
          END
      ) c
  ) on c.Category = cat.Category
order by Category desc

我创建了一个SQL Fiddle,它显示这给出了所需的结果。

需要注意的关键点是我使用子查询来创建所需的类别(cat子查询),然后使用 aleft join将其连接到实际结果 - 这确保始终包含所有必需的类别。

于 2013-12-04T14:57:16.010 回答