我正在尝试从原始数据文件创建一个体积较小的版本,并在最右侧添加 3 COUNT 列。我发现成功为公司网站添加了 COUNT 列,但我在其余两个列上遇到了麻烦。我相信我的问题是当我想要多列输出时不知道如何将
GROUP BY
与 COUNT
一起使用。
原始数据
状态 | 公司网站 | 图像1 | 图像2 |
---|---|---|---|
纽约 | xxx.com | 啊啊 | zz |
纽约 | xxx.com | 空 | yyy |
纽约 | xxx.com | bb | 空 |
纽约 | xxx.com | ccc | 空 |
纽约 | yyy.com | dd | xxx |
纽约 | yyy.com | 空 | 空 |
纽约 | yyy.com | 哎呀 | 空 |
纽约 | yyy.com | 空 | 空 |
这是我尝试过的:
SELECT [STATE],
[COMPANY WEBSITE],
COUNT([COMPANY WEBSITE]) AS [COMPANY COUNT],
COUNT([IMAGE 1]) AS [IMAGE 1 COUNT],
COUNT([IMAGE 2]) as [IMAGE 2 COUNT]
FROM [DATA FILE NAME] GROUP BY [COMPANY WEBSITE]
我期待以下结果:
状态 | 公司网站 | 公司数量 | 图像 1 计数 | 图像 2 计数 |
---|---|---|---|---|
纽约 | xxx.com | 4 | 3 | 2 |
纽约 | yyy.com | 4 | 2 | 1 |
但是我得到的结果是这样的:
状态 | 公司网站 | 公司数量 | 图像 1 计数 | 图像 2 计数 |
---|---|---|---|---|
纽约 | xxx.com | 4 | 4 | 4 |
纽约 | yyy.com | 4 | 4 | 4 |
一种方法是使用条件聚合。这(或非常相似)应该适用于大多数 SQL 变体:
WITH
tbl (STATE, COMPANY_WEBSITE, IMAGE_1, IMAGE_2) AS
( Select 'NY', 'xxx.com', 'aaa', 'zzz' From Dual Union All
Select 'NY', 'xxx.com', NULL, 'yyy' From Dual Union All
Select 'NY', 'xxx.com', 'bbb', NULL From Dual Union All
Select 'NY', 'xxx.com', 'ccc', NULL From Dual Union All
Select 'NY', 'yyy.com', 'ddd', 'xxx' From Dual Union All
Select 'NY', 'yyy.com', NULL, NULL From Dual Union All
Select 'NY', 'yyy.com', 'eee', NULL From Dual Union All
Select 'NY', 'yyy.com', NULL, NULL From Dual
)
Select STATE, COMPANY_WEBSITE,
Count(*) as COMPANY_CNT,
Count(Case When IMAGE_1 Is Not Null Then 1 End) as IMG_1_CNT,
Count(Case When IMAGE_2 Is Not Null Then 1 End) as IMG_2_CNT
From tbl
Group By STATE, COMPANY_WEBSITE
/*
ST COMPANY COMPANY_CNT IMG_1_CNT IMG_2_CNT
-- ------- ----------- ---------- ----------
NY xxx.com 4 3 2
NY yyy.com 4 2 1 */