我有一个函数,它从一个表中选择一些数据。我想返回选定的数据和该表中的行总数。
我怎样才能做到这一点,或者如何以最有效的方式获得同样的结果?
我尝试了一些东西,最后得到了下面的代码,现在这是我想要的格式,但是count(*) over () as total_count将一直返回1,我需要它返回的是records选择的行总数。
SELECT
row_to_json(selected_records) as data
FROM
(
SELECT
count(*) over () as total_count,
array_to_json(array_agg(row_to_json(records))) as data
FROM (
SELECT
sum(entrances) as entrances
FROM report_la
WHERE profile_id = 3777614
GROUP BY landing_path_id
limit 10 offset 0
) records
) as selected_records更新后,下面的代码将产生我想要的结果,如果我可以将total_count列隐藏在records选择中,那就太好了。
SELECT
row_to_json(selected_records) as data
FROM
(
SELECT
min(total_count) as total_count
,array_to_json(array_agg(row_to_json(records))) as data
FROM (
SELECT
sum(entrances) as entrances
,count(*) over () as total_count
FROM ga.report_la
WHERE ga_profile_id = 3777614
GROUP BY landing_path_id
limit 10
) records
) as selected_records发布于 2014-12-04 16:22:04
您可以按照a_horse_with_no_name或ForguesR的建议来做(我相信带有_name的_ more _with_name的建议比ForguesR更有效)。但是,这将在结果集中给出一个额外的列--这可能是您希望的,也可能不是您想要的。这在某种程度上取决于您是否希望获得额外的列(所有列都显示相同的重复数据),或者是否希望在结果集中有类似于“汇总行”的行。
如果您对结果的“汇总行”类型感兴趣,我的回答将说明。
另一个选项是有一个查询,为您提供要查找的COUNT(*),然后将其与原始查询进行UNION。当然,这方面的诀窍是确保两个查询中都有相同数量的列,并确保COUNT(*)查询最后结束。为了做到这一点,我增加了一个列,用来按..。请参阅下面的简单示例。
-- assume col1, col2 are VARCHAR and col3, col4 are NUMERIC
SELECT
col1, col2, col3, col4
FROM (
SELECT
col1, col2, col3, col4, 1 AS sorter
FROM tab1
UNION
SELECT
NULL::VARCHAR AS col1, NULL::VARCHAR AS col2, NULL::NUMERIC AS col3, COUNT(*) AS col4, 2 AS sorter
FROM tab1
) a
ORDER BY a.sorter, a.col1, a.col2;发布于 2014-12-04 16:04:45
只需包含一个子查询,以获取表中所有行的计数。类似于:
SELECT *, (SELECT COUNT(*) FROM yourTable) AS TotalNbRows FROM yourTable发布于 2018-09-26 06:49:24
将聚合查询放入子查询中。
SELECT COUNT( * )
FROM (
SELECT COUNT( * ) AS `count`
FROM lms
WHERE `lead_school_type` =3
AND subscription.vad =1
GROUP BY lms.user_id
) AS subcounthttps://dba.stackexchange.com/questions/84322
复制相似问题