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