Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当结果的行数不同时,如何在一条语句中从表中检索信息?_Sql - Fatal编程技术网

Sql 当结果的行数不同时,如何在一条语句中从表中检索信息?

Sql 当结果的行数不同时,如何在一条语句中从表中检索信息?,sql,Sql,我想从同一个表中的一条语句中检索不同的信息,它们的行数不同 第一个选择在结果中有五行,第二个选择有三行,因为某些价格具有空值。我想如果我可以把零改为空,那么它们将匹配相同数量的行,但我不知道怎么做,或者有其他解决方案吗 select count(ID), Land from Film_ha2911 group by Land union select count(ID) from Film_ha2911 where Price is not null group by Land

我想从同一个表中的一条语句中检索不同的信息,它们的行数不同

第一个选择在结果中有五行,第二个选择有三行,因为某些价格具有空值。我想如果我可以把零改为空,那么它们将匹配相同数量的行,但我不知道怎么做,或者有其他解决方案吗

select count(ID), Land 
from Film_ha2911 
group by Land 

union 

select count(ID) 
from Film_ha2911 
where Price is not null 
group by Land;

无需联合,只需单选即可达到预期效果。 额外列:PriceNotNull以区分是否填充了价格值:

SELECT 
    Land,
    CASE  WHEN Price IS NOT NULL THEN 'True' ELSE 'False' END  PriceNotNull,
    COUNT(ID)  AS Count_ID
FROM Film_ha2911
GROUP BY Land, CASE  WHEN Price IS NOT NULL THEN 'True' ELSE 'False' END 
您可以使用count:

count统计非空值的数量,因此不需要特殊逻辑来统计非空值。按countid,我假设您要计算所有行。count*更为明确——有些人更喜欢count1

如果您真的希望在单独的行中显示此值,我将添加一个指标来说明计数的含义:

select Land, 'total rows' as which, count(*) as total_rows
from Film_ha2911 
group by Land
union all
select Land, 'with price', count(price)
from Film_ha2911 
group by Land;

但是,我认为第一个版本有两个单独的列更有用。

使用UNION意味着select中列的数量和类型必须对应 因此,在您的情况下,应该为not select列使用null

select count(ID), Land 
from Film_ha2911 
group by Land 
union 
select count(ID), null  
from Film_ha2911 
where Price is not null 
group by Land;
但在这种情况下,似乎需要在land的子查询上使用左连接

select  t1.count1, t1.land , t2.count2
from (
  select count(ID) count1, Land 
  from Film_ha2911 
  group by Land 
) t1 
left join  (
  select count(ID) count2, land  
  from Film_ha2911 
  where Price is not null 
  group by Land;
) t2 on t1.land = t2.land 

标签已调整。数据库引擎是SQL Server还是MySQL?我只需要SQL,我需要在它旁边添加什么?不同的数据库引擎在SQL语法上有差异。你在第一行t1.count1、t1.land、t2.count2中所做的一切在我看来就像是你创建了变量并使用了它们。这个过程叫什么。你能再解释一下吗?或者给我一些我能搜索到的东西吗?@Birouti。。这些都不是可变的。。这些是列名table_name.column_name这些列是从子查询中选择的。。从选择。。。表名使用t1,列名使用count1称为alias。。表别名或列别名。。并且经常在sql中使用,以获得更好的可读性,并便于列引用管理。。
select  t1.count1, t1.land , t2.count2
from (
  select count(ID) count1, Land 
  from Film_ha2911 
  group by Land 
) t1 
left join  (
  select count(ID) count2, land  
  from Film_ha2911 
  where Price is not null 
  group by Land;
) t2 on t1.land = t2.land