我有一个表格如下图所示:
root
|id
|name
|col1
|col2
|...
|col30
条件是多行可以具有相同的名称(它们不是主键 - 键是ID)。 col1-col30中的值将是一些字符串,或者它可以包含字符串" null"。
我对每个名字填写的列数感兴趣。
例如,
如果名称" test1
"已将col1-5
填充到一行,另一行有" test1
"并填写col1, 3, 10, 6
(其余未填充的列只是字符串值" null")," test1
"应该有值9
。
我对SQL很陌生并一直在寻找这个......请帮忙。
答案 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;