如何对大量结果的别名列进行分组

How to Group alias columns for a large number of results

我浏览了与别名列分组相关的其他答案,但我相信我尝试做的事情很常见,我非常困惑为什么这会创建需要大量子查询的复杂查询或 CTE。我的目标是查看当前正在使用的不同列并确定每列中空值或不同值的百分比。为此,我只是尝试对每个 column/variable 的新列中的多个不同字段 (400) 应用相同的逻辑。我希望我的结果 table 看起来像这样:

FIELD             COUNT_DISTINCT                       Null_COUNT
Field_1   |  COUNT(DISTINCT Field_1)  | SUM(CASE WHEN Field_1 IS NULL THEN 1 ELSE 0 END)
Field_2   |  COUNT(DISTINCT Field_2)  | SUM(CASE WHEN Field_2 IS NULL THEN 1 ELSE 0 END)
Field_3   |  COUNT(DISTINCT Field_3)  | SUM(CASE WHEN Field_3 IS NULL THEN 1 ELSE 0 END)
.....
Field_400 | COUNT(DISTINCT Field_400) | SUM(CASE WHEN Field_400 IS NULL THEN 1 ELSE 0 END)

我的查询必须在 Excel 中编辑,因为它非常长,但即使是较小的查询,我也无法得到这个结果。到目前为止,我尝试了以下方法:

SELECT
"Field 1",
COUNT(DISTINCT Field_1) AS COUNT_DISTINCT,
"Field 2",
COUNT(DISTINCT Field_2) AS COUNT_DISTINCT,
"Field 3",
COUNT(DISTINCT Field_3) AS COUNT_DISTINCT
FROM XYZ
GROUP BY COUNT_DISTINCT

#这是错误的,不能按别名分组

SELECT
COUNT(DISTINCT Field_1) AS COUNT_DISTINCT,
COUNT(DISTINCT Field_2) AS COUNT_DISTINCT,
COUNT(DISTINCT Field_3) AS COUNT_DISTINCT
FROM XYZ
GROUP BY COUNT(DISTINCT '')  

#this syntax was suggested in a similar question 但我收到以下错误:

如果我还没有对此进行足够的研究,我真的很抱歉,但是除了使这个查询变得非常复杂并且难以扩展我需要提取的所有变量之外,还有什么建议吗?非常感谢

其实很简单:-)
不需要 GROUP BY。

SELECT
COUNT(DISTINCT Field_1) AS COUNT_DISTINCT_Field_1,
COUNT(DISTINCT Field_2) AS COUNT_DISTINCT_Field_2,
COUNT(DISTINCT Field_3) AS COUNT_DISTINCT_Field_3
FROM XYZ

之前的解决方案 + UNPIVOT

with t as
(
    SELECT
          COUNT(DISTINCT Field_1) AS f1,
          COUNT(DISTINCT Field_2) AS f2,
          COUNT(DISTINCT Field_3) AS f3
    FROM XYZ
)
select *
from  t UNPIVOT (COUNT_DISTINCT FOR field IN (f1,f2,f3))

据我了解,您可以通过以下方式实现您的目标。

SELECT
"Field 1" as Field,
COUNT(DISTINCT Field_1) AS COUNT_DISTINCT,
SUM(CASE WHEN Field_1 IS NULL THEN 1 ELSE 0 END) as Null_COUNT
FROM XYZ
GROUP BY Field

UNION

SELECT
"Field 2" as Field,
COUNT(DISTINCT Field_2) AS COUNT_DISTINCT,
SUM(CASE WHEN Field_2 IS NULL THEN 1 ELSE 0 END) as Null_COUNT
FROM XYZ
GROUP BY Field

UNION

SELECT
"Field 3" as Field,
COUNT(DISTINCT Field_3) AS COUNT_DISTINCT,
SUM(CASE WHEN Field_3 IS NULL THEN 1 ELSE 0 END) as Null_COUNT
FROM XYZ
GROUP BY Field
..
UNION
..
SELECT
"Field 400" as Field,
COUNT(DISTINCT Field_400) AS COUNT_DISTINCT,
SUM(CASE WHEN Field_400 IS NULL THEN 1 ELSE 0 END) as Null_COUNT
FROM XYZ
GROUP BY Field