SELECT count(*)然后输出空或非空为是或否

时间:2014-04-24 10:58:05

标签: sql oracle

查看SALES部门的位置是否与交通部门完全相同“(假设空结果表示是,任何非空结果表示否)

在我的数据库中得到了这张表。

//DEPTLOC
DNAME      CITY
----------------
SALES     LONDON
TRANSPORT LONDON
TRANSPORT BOSTON
SCIENCE   BOSTON

不确定如何编写查询,但至少我尝试

SELECT COUNT(*) FROM DEPTLOC WHERE 
     (DNAME='SALES' AND DNAME='TRANSPORT') AND 

我应该如何在sql中的AND运算符之后编写以获得类似这样的输出

//Display
YES . (<--- LONDON , got SALES and TRANSPORT in same cities)

8 个答案:

答案 0 :(得分:2)

您可以使用decode

SELECT Decode(Count(*), 0, 'No', 
                        'Yes') 
FROM   {rest of your query}

DECODE逐个将expr与每个搜索值进行比较。如果expr等于搜索,则Oracle数据库返回相应的结果。如果未找到匹配项,则Oracle返回默认值。如果省略default,则Oracle返回null。

答案 1 :(得分:0)

这个问题有点含糊不清,但我现在认为这就是问:给出“是”&#39;如果所有有销售的城市都有运输,否则没有。

我相信这个查询应该实现这个目标。

SELECT CASE WHEN Cnt = 0 THEN 'NO' ELSE 'YES' END AS Answer FROM
    (SELECT COUNT(*) AS Cnt FROM DUAL
     WHERE NOT EXISTS
        (SELECT * FROM DeptLoc dl
         WHERE dl.DName = 'SALES' AND NOT EXISTS
             (SELECT * FROM DeptLoc
              WHERE City = dl.City AND DName = 'TRANSPORT')));

Raging Bull从SQL Fiddle修改:http://www.sqlfiddle.com/#!4/ff7a8/1

答案 2 :(得分:0)

我想,这就是你所追求的:

SELECT CITY,COUNT(*),CASE WHEN COUNT(*)>2 THEN 'YES' ELSE 'NO' END AS STATUS
FROM DEPTLOC WHERE 
(DNAME='SALES' OR DNAME='TRANSPORT') 
AND CITY='LONDON'
GROUP BY CITY

结果:

CITY    COUNT(*)    STATUS
LONDON  2           YES

请参阅SQL Fiddle中的结果。

<强>说明

仅当

STATUS字段为该城市返回2行时,该字段才为YES。 .i.e。,1表示Sales,1表示Transport

答案 3 :(得分:0)

要了解您是否有销售和运输,您应该使用自我加入。

通过将DEPTLOC表别名为“sales”和“transport”并加入城市名称,您将获得同时具有销售和销售额的城市列表。运输。

SELECT sales.CITY
FROM DEPTLOC sales 
INNER JOIN DEPTLOC transport ON sales.CITY = transport.CITY
WHERE sales.DNAME = 'SALES'
AND transport.DNAME = 'TRANSPORT'

要获取yes和no的列表,您可以将上述内容用作子查询并使用case语句。我添加了distinct子句以消除任何重复的条目。

SELECT DISTINCT CITY, 
CASE WHEN salesandtransport.CITY IS NULL THEN 'NO' ELSE 'YES' END as DISPLAY
FROM DEPTLOC 
LEFT JOIN 
(SELECT sales.CITY AS CITY
FROM DEPTLOC sales 
INNER JOIN DEPTLOC transport ON sales.CITY = transport.CITY
WHERE sales.DNAME = 'SALES'
AND transport.DNAME = 'TRANSPORT') salesandtransport ON DEPTLOC.CITY = salesandtransport.CITY

答案 4 :(得分:0)

有很多方法可以解决这个问题。以下使用full outer join来比较两组城市。我们的想法是,任何不匹配的城市都会产生NULL值。这是通过将count(*)count(xx.City)进行比较来检测的:

select (case when count(*) = count(dls.City) and count(*) = count(dlt.City)
             then 'Yes'
             else 'No'
        end)
from DeptLoc dls full outer join
     DeptLoc dlt
     on dls.Dname = 'Sales' and dlt.Dname = 'Transport' and dls.City = dlt.City;

答案 5 :(得分:0)

我认为您应该按CITY分组并输出DEPTS计数不等于您需要的DEPTS数量的城市(在这种情况下为2):

SELECT CASE WHEN 
         EXISTS(SELECT CITY FROM DEPTLOC
                       WHERE DNAME IN('SALES','TRANSPORT')
                       GROUP BY CITY
                       HAVING COUNT(*)<>2
                )
          THEN 'NO'
          ELSE 'YES'
        END
FROM DUAL;

SQL Fiddle demo

答案 6 :(得分:0)

这个简单的查询应该对你有用:

SELECT CITY,'YES' FROM DEPTLOC 
   WHERE CITY IN(SELECT CITY FROM DEPTLOC WHERE DNAME='TRANSPORT') 
         AND DNAME ='LOCATION'

OUTPUT将拥有那些同时具有交通和位置的城市,如下所示:

LONDON   YES

答案 7 :(得分:0)

这是另一种选择。在具有DNAME作为SALES和TRANSPORT的行之间进行全外连接。如果在另一组中有任何CITY为NULL的行,则会发现它们之间存在差异,如下所示:

SELECT DECODE(COUNT(*), 0, 'YES', 'NO') Display
FROM
(
    SELECT s.DNAME as s_DNAME, s.CITY as s_CITY, t.DNAME as t_DNAME, t.CITY as t_CITY
    FROM
    (SELECT DNAME, CITY
    FROM DEPTLOC 
    WHERE DNAME = 'SALES') s
    FULL OUTER JOIN
    (SELECT DNAME, CITY
    FROM DEPTLOC
    WHERE DNAME = 'TRANSPORT'
    ) t
    ON s.CITY = t.CITY
    WHERE s.CITY IS NULL OR t.CITY IS NULL
);

这里是 SQL Fiddle

SQL Fiddle还包含一个查询,列出只有SALES或TRANSPORT的城市。