如何通过id查找sql​​组中多列的计数?

时间:2018-01-21 19:53:42

标签: sql apache-spark-sql

我有一个表格如下图所示:

root
|id
|name
|col1
|col2
|...
|col30

条件是多行可以具有相同的名称(它们不是主键 - 键是ID)。 col1-col30中的值将是一些字符串,或者它可以包含字符串" null"。

我对每个名字填写的列数感兴趣。

例如,

如果名称" test1"已将col1-5填充到一行,另一行有" test1"并填写col1, 3, 10, 6(其余未填充的列只是字符串值" null")," test1"应该有值9。 我对SQL很陌生并一直在寻找这个......请帮忙。

2 个答案:

答案 0 :(得分:0)

尝试一下:

SELECT 
    name,
    CASE WHEN col1_max IS NOT NULL THEN 1 ELSE 0 END + -- Only include non-NULL values
    CASE WHEN col2_max IS NOT NULL THEN 1 ELSE 0 END
FROM (
    SELECT
        name,
        MAX(col1) AS col1_max, -- Non-NULL values come before NULL
        MAX(col2) AS col2_max
    FROM MyTable
    GROUP BY name
) src

您可以添加更多其他列以适合您的情况。

<强>更新
我刚刚意识到你的NULL情况是&#34; null&#34;串。改性:

SELECT 
    name,
    CASE WHEN col1_max IS NOT NULL THEN 1 ELSE 0 END + -- Only include non-NULL values
    CASE WHEN col2_max IS NOT NULL THEN 1 ELSE 0 END
FROM (
    SELECT
        name,
        MAX(CASE WHEN col1 = 'null' THEN NULL ELSE col1 END) AS col1_max, -- Non-NULL values come before NULL
        MAX(CASE WHEN col2 = 'null' THEN NULL ELSE col2 END) AS col2_max
    FROM MyTable
    GROUP BY name
) src

答案 1 :(得分:0)

首先你unpivot你的表并计算那些not null值的行。在postgres中,您可以使用unnest来实现此目的。我只使用col1..7 - 在您的情况下更改为col30

WITH t AS(
SELECT id,name,
       unnest(array['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7']) AS colname,
       unnest(array[col1, col2, col3, col4, col5, col6, col7]) AS colvalue       
FROM your_table)
SELECT id, name, 
    SUM(CASE WHEN colvalue IS NULL THEN 0 ELSE 1 END) AS count_filled
FROM t
GROUP BY 1,2;