我有table A
五行和以下值:
Column1 Column2 Column3 Column4
------- ------- ------- -------
anna ben cat d
anna ben cat e
anna ben cat f
gina hugh ken m
gina hugh ken p
我想添加另一个名为Column5
的列。 Column 5
的值在前3行中为3,在接下来的2行中为2:
Column1 Column2 Column3 Column4 Column5
------- ------- ------- ------- -------
anna ben cat d 3
anna ben cat e 3
anna ben cat f 3
gina hugh ken m 2
gina hugh ken p 2
我是怎么做到的:
SELECT DISTINCT COUNT (DISTINCT t1.Column4) AS Column5,
Column1, Column2, Column3, Column4
FROM TableA AS t1
GROUP BY Column1, Column2, Column3;
这不起作用:
消息8120,等级16,状态1,程序COUNT,行29 专栏'第4列'在选择列表中无效,因为它不包含在任何一个中 聚合函数或GROUP BY子句。
请帮忙吗?非常感激。
PS:如果我在group by子句中添加Column4
,我只会得到" 1"在Column5
中的结果表中。
答案 0 :(得分:4)
另一种做你想要的方法是首先选择不同的行,然后应用窗口的COUNT()函数:
WITH distinctrows AS (
SELECT DISTINCT
Column1,
Column2,
Column3,
Column4
FROM TableA
)
SELECT
Column1,
Column2,
Column3,
Column4,
COUNT(Column4) OVER (PARTITION BY Column1, Column2, Column3) AS Column5
FROM distinctrows
;
答案 1 :(得分:3)
如果您不需要DISTINCT
,这将很容易。
SELECT Column1,
Column2,
Column3,
Column4,
Count(Column4) OVER (partition BY Column1, Column2, Column3) AS Column5
FROM TableA AS t1
但SQL Server中的窗口聚合目前不支持DISTINCT
,因此您可以使用
WITH CTE
AS (SELECT Column1,
Column2,
Column3,
Count(DISTINCT Column4) AS Column5
FROM TableA
GROUP BY Column1,
Column2,
Column3)
SELECT A.Column1,
A.Column2,
A.Column3,
A.Column4,
C.Column5
FROM TableA A
JOIN CTE C
ON A.Column1 = C.Column1
AND A.Column2 = C.Column2
AND A.Column3 = C.Column3
(为了简单起见,我假设列不可为空)
答案 2 :(得分:1)
这是你在找什么?
SELECT COUNT (DISTINCT t1.Column4) AS Column5,
Column1, Column2, Column3
FROM TableA AS t1
GROUP BY Column1, Column2, Column3;
答案 3 :(得分:1)
这应该这样做:
;WITH
countCol4 As
(
SELECT Column1, Column2, Column3, Column4
, ROW_NUMBER() OVER(PARTITION BY Column1, Column2, Column3, Column4
ORDER BY Column4) As Col4Count
FROM TableA As t1
)
SELECT Column1, Column2, Column3, Column4
, COUNT(*) OVER(PARTITION BY Column1, Column2, Column3) As Column5
FROM countCol4
WHERE Col4Count = 1
答案 4 :(得分:0)
除了“取消设置”我刚读过的“仅完全分组”模式但还没有尝试过,我只是应用了以下更快的解决方案,这是一个技巧,我这样做是为了避免出现这个错误:< / p>
SELECT
COUNT (DISTINCT t1.Column4) AS Column5, Column1, Column2, Column3, MAX(Column4) AS Column4
FROM TableA AS t1
GROUP BY Column1, Column2, Column3;
我在Column4上有字符值。这似乎没问题,我现在看到Column5中的值为1-6,正如我预期的那样。谢谢!
警告:这不是一个好的答案。请参阅以下评论以了解原因。