如果未找到任何行,则返回单个行。

4

我有一个T-SQL查询,我们用于CrystalReport报表。

SELECT COUNT(*) AS Expr1, [Date], StoreNumber
FROM   dbo.Orderp
WHERE  (OpServerNumber = 0)
GROUP BY [Date], StoreNumber

如果特定日期和商店没有任何有效行,则会出现问题。

如果查询在表中找不到任何行,是否可以返回Expr1 = 0的单行?


1
StoreNumber是另一张表的外键吗?换句话说,即使某个店铺在特定日期没有条目,每个店铺是否都需要在报告中表示? - 8kb
你真的需要在SQL中解决这个问题吗?还是改变消费结果集以对未返回任何行做出反应更好? - Damien_The_Unbeliever
6个回答

4
如果您想至少返回一行数据,可以使用 EXISTS 条件,例如下面的示例:
IF EXISTS(SELECT COUNT(*) AS Expr1, [Date], StoreNumber FROM   dbo.Orderp WHERE  (OpServerNumber = 0) GROUP BY [Date], StoreNumber)
    SELECT COUNT(*) AS Expr1, [Date], StoreNumber FROM   dbo.Orderp WHERE  (OpServerNumber = 0) GROUP BY [Date], StoreNumber
ELSE
    SELECT 0 AS Expr1, NULL [Date], 0 StoreNumber 

0
SELECT 
    COUNT(*) AS Expr1, [Date], StoreNumber 
FROM dbo.Orderp WHERE  (OpServerNumber = 0) GROUP BY [Date], StoreNumber

if @@ROWCOUNT = 0
    SELECT 0 AS Expr1, NULL [Date], 0 StoreNumber 

0
select Expr1, [Date], StoreNumber from (
    select *,row_number() over (order by isrealrow desc) rownum from (
        select COUNT(*) as Expr1,[Date], StoreNumber, 1 as isrealRow FROM  dbo.Orderp
        WHERE  (OpServerNumber = 0)
        GROUP BY [Date], StoreNumber
        union
        select 0, NULL, NULL, 0 as isrealrow 
    ) b
)c
where isrealRow=1 or rownum=1

这是我今天写过的最酷的SQL语句。


0
SELECT ISNULL(B.num,0) AS Expr1, A.[Date], A.StoreNumber
FROM 
(SELECT [Date], StoreNumber FROM dbo.Orderp GROUP BY [Date], StoreNumber) A
LEFT OUTER JOIN
(SELECT COUNT(*) AS num, [Date], StoreNumber
FROM   dbo.Orderp
WHERE  (OpServerNumber = 0)
GROUP BY 
[Date], StoreNumber) B ON A.[Date]=B.[Date] AND A.StoreNumber=B.StoreNumber

编辑:我刚想到另外一个...

SELECT
SUM(Expr1) AS Expr1, [Date], StoreNumber
FROM
(SELECT 0 AS Expr1, [Date], StoreNumber, NULL AS OpServerNumber
FROM   dbo.Orderp
GROUP BY [Date], StoreNumber
UNION ALL
SELECT 1, [Date], StoreNumber, OpServerNumber
FROM   dbo.Orderp)T
WHERE OpServerNumber IS NULL OR OpServerNumber = 0
GROUP BY [Date], StoreNumber

0

如果您将此封装在存储过程中,可以执行以下操作:

  • 将这些行选择到表变量或临时表中
  • 检查 @@ROWCOUNT,如果它是 IF @@ROWCOUNT = 0,则显式地向该临时表添加一个虚拟行
  • 通过 SELECT * FROM ..... 从临时表中返回内容作为存储过程的结果

抱歉,将数据存储到临时表中并检查行数,然后再添加虚拟行是一个繁琐的过程。只需在存在条件中进行检查即可。 - Upendra Chaudhari
@upendra chaudhari:这取决于你有多少行数据 - 如果只有几百行,你不会注意到任何差异。只有当你有数百万或数千万行时,暂时存储所需的时间才可能成为一个因素。 - marc_s
这里不是关于多少行和多行性能问题的问题。它只需要检查是否有任何一行匹配。我们只需要检查单个行,可以使用Exists条件,就像我的答案一样。 - Upendra Chaudhari

0
问题在于您在单个查询中同时使用了count(*)和其他列。
如果满足where子句,查询至少会返回一行。
您需要将count(*)和仅包含列的查询分开。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接