我有数据
ID Group Status
0001 A T
0002 B T
0003 AA T
0004 C T
0005 AAB T
0006 CC T
0007 CCA T
0008 CCAA T
0009 AABA F
0010 BA F
我想计算具有相同(喜欢)组的ID数量并排除F状态 例如:0001具有A组,而0003(AA),0005(AAB)是同一组,因为其参考A. 0009(AABA)也在0001以下但状态为F
ID CountofGroup
0001 2
0002 0
0003 1
0004 3
0005 0
0006 2
0007 1
0008 0
0009 Status F
0010 Status F
你们可以帮帮我吗? 感谢您的帮助
答案 0 :(得分:1)
这应该有用。
<强>查询:强>
Select d1.ID
, CASE WHEN d1.[Status] = 'F' THEN 'Status F'
ELSE CAST(COUNT(d2.ID) as varchar(10))
END
FROM @data d1
LEFT JOIN @data d2
ON d2.[Group] LIKE d1.[Group]+'%'
AND d2.[Group] <> d1.[Group]
AND d2.Status <> 'F'
GROUP BY d1.ID, d1.[Status]
ORDER BY d1.ID
我不确定两次或更多次没有“AA”等重复。因此,我在d2.[Group] <> d1.[Group]
而不是d2.[ID] <> d1.[ID]
进行测试。如果没有重复,则在[ID]
上进行测试会更有效。
数据:强>
DECLARE @data TABLE([ID] int, [Group] varchar(4), [Status] varchar(1));
INSERT INTO @data([ID], [Group], [Status])
VALUES
(0001, 'A', 'T'),
(0002, 'B', 'T'),
(0003, 'AA', 'T'),
(0004, 'C', 'T'),
(0005, 'AAB', 'T'),
(0006, 'CC', 'T'),
(0007, 'CCA', 'T'),
(0008, 'CCAA', 'T'),
(0009, 'AABA', 'F'),
(0010, 'BA', 'F')
;
<强>输出:强>
ID Count
1 2
2 0
3 1
4 3
5 0
6 2
7 1
8 0
9 Status F
10 Status F
答案 1 :(得分:0)
只需要一个简单的相关子查询就可以了:
SELECT *, (SELECT COUNT(*) FROM @t
WHERE [Status] = 'T' AND ID <> t.ID AND [Group] LIKE t.[Group] + '%') As CountofGroup
FROM @t t
答案 2 :(得分:-2)
这样的事情:
select t.ID, count(t2.ID) from
mytable t join mytable t2 on (
t2.Group like t1.Group + '%'
and
t2.ID != t1.ID
/* it's required without it it will count itself +1 time*/
)
where t1.Status = 'T' and t2.Status = 'T'
group by t.ID
order by t.ID
```
虽然您不熟悉T-SQL,但请注意:
1)
mytable t1 join mytable t2 -- replace mytable with your table name
不要害怕mytable被引用两次 - 这符合您的要求 - 您希望从mytable获取数据然后将其与mytable进行比较
2) 我们不知道处理了多少数据 - 如果它是10 - 100000行 - 这个查询将是有用的 - 如果更多 - 可能需要一些修正和优化
3) 我们不知道你的表中的索引在哪里。 这里 - 最好为Group和Status字段制作索引,并检查ID是否是真正的主键