Sql 如果在2005年SSRS报告中未找到记录,如何获取和填充零“0”
我使用SSRS报告根据类别获得结果,类别值更改为是、否、不符合,替换为1=是、2=否、3=不符合。 问题是Sql 如果在2005年SSRS报告中未找到记录,如何获取和填充零“0”,sql,reporting-services,Sql,Reporting Services,我使用SSRS报告根据类别获得结果,类别值更改为是、否、不符合,替换为1=是、2=否、3=不符合。 问题是 SELECT ( CASE WHEN A = '99' or B = '99' THEN 3 WHEN C + D >= 10 THEN 1 ELSE 2 END) as Category, SELECT ( CASE WHEN A = '99' or B = '99'
SELECT (
CASE
WHEN A = '99' or B = '99' THEN 3
WHEN C + D >= 10 THEN 1
ELSE 2
END) as Category,
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
)
结果是,
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%
例如,如果找不到Not Met的结果,我希望这样的结果是零
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,
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
)
请帮助,因为这是我的最后一个项目,我被卡住了
谢谢
我的样本数据。。。
需要考虑的要点:
1以上是我的样本数据
2表A和B在ID上有内部联接,将产生结果
3根据上述选择条件填充类别,但问题是,*如果没有条件匹配,则不会填充类别,但我也希望填充缺少的类别。在本例中,它是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来获得结果,但我不知道怎么做???我曾经遇到过这个问题。我做了一个快速修复,创建一个临时表并将结果插入临时表,然后检查临时表中是否缺少三个类别中的任何一个,然后在临时表中插入一行,其中包含所需的默认值。下面是一个示例代码,只是给你一个想法
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
您可以使用类似以下内容的查询:
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
我已经创建了一个示例,它显示了所需的结果
需要注意的关键点是,我正在使用子查询创建所需的类别cat子查询,然后使用左连接将其连接到实际结果-这确保始终包含所有所需的类别。感谢Kamran的回复,Kamran感谢您的回复。.我喜欢您的想法,但请您进一步解释一下如何动态创建表,因为每个报表的字段都不同,并且只涉及2个表1是主表,2是根据用户角色包含权限。其次,我的用户只有浏览/查看权限,他们是否可以创建表,因为报表也有安全因素。请告诉我在哪里添加CREATE和DROP命令。您好,您可以动态处理列名,以便列根据表定义增长。您可以通过sys.tables找到列名,如下所示:从sys.columns a中选择a.collation\u name,其中a.object\u id=object\u name“在此处输入表名”。由于您将使用SELECTINTO命令,所以不使用create语句,并且应该在返回所需结果之后进行删除。我希望这有助于Shi Kamran,我已经完成了一半,如果我在一张表(即表A)上实施这个想法,我会得到结果,但我有另一个表,即表B。表B有一些与表A相同的字段。结果也来自表B的内部联接。请给出如何将您的上述想法与表B联接的建议。有关更多详细信息,请参阅我发布的第一个问题。非常感谢。当我将表A、表B的结果插入Temp时,我得到了以下错误,因为表B有两个与表A字段相同的字段。错误:每个表中的Msg 2705,16级,状态3,第1行列名必须唯一。表“Temp”中的列名“ID”被多次指定。您能发布表A和表B中的原始数据吗?谢谢您的回复。我将尝试我的查询和实际数据,并让你很快知道。嗨,伊恩,谢谢你的绝妙想法。在对真实数据应用查询后,我将获得所有类别,即1、2、3,但包含所有额外记录。所以我添加了WHERE条件,这是实际查询的一部分,现在我再次得到的是真正的条件类别。这意味着再次没有丢失的类别。我在order by category desc命令之前添加了WHERE条件。如果你能帮我解开这个谜,我将不胜感激。谢谢,请在注释中用您的名字查看原始查询的上方的my WHERE子句。
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