Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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_Database_Postgresql_Group By_Count - Fatal编程技术网

Sql 为零的项目列表的计数不存在

Sql 为零的项目列表的计数不存在,sql,database,postgresql,group-by,count,Sql,Database,Postgresql,Group By,Count,如果我有一个表t1,其中包含: 我有一张关于福和你好的名单 我如何获得: 如果我这么做的话 SELECT my_col, COUNT(*) FROM t1 WHERE my_col in ('foo', 'hello') GROUP BY my_col 我明白了 对hello没有任何价值 我特别希望这是对项目列表的引用,因为这将在列表为变量的程序中调用。您可以将列表转换为一组行并使用左连接,如: 您可以将列表转换为一组行并使用左联接,如: 理想情况下,您应该维护一个单独的表,其中包含希望显示

如果我有一个表t1,其中包含:

我有一张关于福和你好的名单

我如何获得:

如果我这么做的话

SELECT my_col, COUNT(*) 
FROM t1
WHERE my_col in ('foo', 'hello')
GROUP BY my_col
我明白了

对hello没有任何价值


我特别希望这是对项目列表的引用,因为这将在列表为变量的程序中调用。

您可以将列表转换为一组行并使用左连接,如:


您可以将列表转换为一组行并使用左联接,如:


理想情况下,您应该维护一个单独的表,其中包含希望显示在报表中的所有可能的列值。如果没有,我们可以在此处尝试使用CTE:

WITH cte AS (
    SELECT 'foo' AS my_col UNION ALL
    SELECT 'bar' UNION ALL
    SELECT 'hello'
)

SELECT
    a.my_col,
    COUNT(b.my_col) AS count
FROM cte a
LEFT JOIN t1 b
    ON a.my_col = b.my_col
WHERE
    a.my_col IN ('foo', 'hello')
GROUP BY
    a.my_col;

理想情况下,您应该维护一个单独的表,其中包含希望显示在报表中的所有可能的列值。如果没有,我们可以在此处尝试使用CTE:

WITH cte AS (
    SELECT 'foo' AS my_col UNION ALL
    SELECT 'bar' UNION ALL
    SELECT 'hello'
)

SELECT
    a.my_col,
    COUNT(b.my_col) AS count
FROM cte a
LEFT JOIN t1 b
    ON a.my_col = b.my_col
WHERE
    a.my_col IN ('foo', 'hello')
GROUP BY
    a.my_col;

下面是另一种使用值的方法:


请注意,count t1.my_col为hello返回一个0,因为不计算空值。count*by contast将为hello返回1,因为它正在计算行数。

这里还有另一种方法,使用值:

请注意,count t1.my_col为hello返回一个0,因为不计算空值。count*by contast将为hello返回1,因为它正在计算行数。

Postgres解决方案:

一种方法是将“列表”放入数组,然后使用unnest将数组转换为列。然后对该列与另一个表执行左联接,并执行计数

WITH t1 AS (
     SELECT 'foo' AS my_col UNION ALL
     SELECT 'foo' UNION ALL
     SELECT 'bar'
)

SELECT
    a.my_col,
    COUNT(b.my_col) AS count
FROM unnest(ARRAY['foo', 'hello']) a (my_col)
LEFT JOIN t1 b
    ON a.my_col = b.my_col
GROUP BY
    a.my_col;
我对其他答案的问题是,虽然他们帮助我找到了解决方案,但他们没有提供一个解决方案,其中感兴趣的项位于一个列表中,而该列表不是实际的sql术语,因此问题出在我身上

然而,我真正的用例是使用java和hibernate执行本机查询,不幸的是,上面的操作不起作用,因为无法确定类型。相反,我将我的列表转换为单个字符串,并使用字符串到数组来代替数组函数

下面是对我的用例最有效的解决方案,但在这一点上,其他答案也同样正确,因为我现在必须手动操作字符串,但为了子孙后代的利益,我把它留在这里

WITH t1 AS (
    SELECT 'foo' AS my_col UNION ALL
    SELECT 'foo' UNION ALL
    SELECT 'bar'
)

SELECT
    a.my_col,
    COUNT(b.my_col) AS count
FROM unnest(string_to_array('foo, hello', ',')) a (my_col)
LEFT JOIN t1 b
    ON a.my_col = b.my_col
GROUP BY
    a.my_col;
Postgres解决方案:

一种方法是将“列表”放入数组,然后使用unnest将数组转换为列。然后对该列与另一个表执行左联接,并执行计数

WITH t1 AS (
     SELECT 'foo' AS my_col UNION ALL
     SELECT 'foo' UNION ALL
     SELECT 'bar'
)

SELECT
    a.my_col,
    COUNT(b.my_col) AS count
FROM unnest(ARRAY['foo', 'hello']) a (my_col)
LEFT JOIN t1 b
    ON a.my_col = b.my_col
GROUP BY
    a.my_col;
我对其他答案的问题是,虽然他们帮助我找到了解决方案,但他们没有提供一个解决方案,其中感兴趣的项位于一个列表中,而该列表不是实际的sql术语,因此问题出在我身上

然而,我真正的用例是使用java和hibernate执行本机查询,不幸的是,上面的操作不起作用,因为无法确定类型。相反,我将我的列表转换为单个字符串,并使用字符串到数组来代替数组函数

下面是对我的用例最有效的解决方案,但在这一点上,其他答案也同样正确,因为我现在必须手动操作字符串,但为了子孙后代的利益,我把它留在这里

WITH t1 AS (
    SELECT 'foo' AS my_col UNION ALL
    SELECT 'foo' UNION ALL
    SELECT 'bar'
)

SELECT
    a.my_col,
    COUNT(b.my_col) AS count
FROM unnest(string_to_array('foo, hello', ',')) a (my_col)
LEFT JOIN t1 b
    ON a.my_col = b.my_col
GROUP BY
    a.my_col;

这份名单来自哪里?它是否存储在表中?值不保证在表中。它们将来自一个xml文件。列表来自哪里?它是否存储在表中?值不保证在表中。它们将来自一个xml文件。我认为count*将返回1表示hello。如果您将其更改为count t1.*则会得到所需的结果。@Hambone:谢谢您的检查和评论!我更新了答案,我想count*会为hello返回1。如果您将其更改为count t1.*则会得到所需的结果。@Hambone:谢谢您的检查和评论!我根据你的解释更新了答案,你的解释很有道理;我明白为什么发布的解决方案不能完全满足需要。我不知道Java/JDBC,但在使用Npgsql的ADO.net中,可以将数组作为参数传递。例如cmd.Parameters[0].Value=newstring[3]{foo,bar,baz}。如果您的数据库适配器本机支持此功能,我建议您使用此功能,而不是先传递连接的字符串,然后再拆分它。我同意最好直接传递数组。似乎有对传递数组的支持,但我一直收到postgres类型的错误。所以界面中有些东西丢失了。我猜有办法做到这一点,但事实上,我猜在我之上的人会改变他们对自己想要什么的想法,然后所有的赌注都输掉了:你的解释很有道理;我明白为什么发布的解决方案不能完全满足需要。我不知道Java/JDBC,但在使用Npgsql的ADO.net中,可以将数组作为参数传递。例如cmd.Parameters[0].Value=newstring[3]{foo,bar,baz}。如果您的数据库适配器本机支持此功能,我建议使用t
我同意直接传递数组会更好。似乎有对传递数组的支持,但我一直收到postgres类型的错误。所以界面中有些东西丢失了。我猜有办法做到这一点,但事实上,我猜在我之上的人会改变他们对自己想要什么的想法,然后所有的赌注都会落空:
WITH t1 AS (
     SELECT 'foo' AS my_col UNION ALL
     SELECT 'foo' UNION ALL
     SELECT 'bar'
)

SELECT
    a.my_col,
    COUNT(b.my_col) AS count
FROM unnest(ARRAY['foo', 'hello']) a (my_col)
LEFT JOIN t1 b
    ON a.my_col = b.my_col
GROUP BY
    a.my_col;
WITH t1 AS (
    SELECT 'foo' AS my_col UNION ALL
    SELECT 'foo' UNION ALL
    SELECT 'bar'
)

SELECT
    a.my_col,
    COUNT(b.my_col) AS count
FROM unnest(string_to_array('foo, hello', ',')) a (my_col)
LEFT JOIN t1 b
    ON a.my_col = b.my_col
GROUP BY
    a.my_col;