TSQL -- 在 table 中查找一列中有多个值且在另一列中至少出现一次特定值的记录
TSQL -- find records in table with multiples in one column, and at least one specific occurrence of a value in another column
TSQL -- 在 table 中查找一列中有多个值且在另一列中至少有一次特定值出现的记录
如果我有:
ourDB.dbo.ourTable col1 和 col2 以及 col 3
我想找到这样的事件
* col1 的值出现多次
* col2 的至少一个实例 = 'Val1' 至少一次。
TSQL -- 在 table
中查找特定事件
所以开始的人会是:
Select col1, col2, col3
FROM ourDB.dbo.ourTable
having count(col1) > 1
WHERE
(col2 = 'Val1')
Group by col1, col2, col3
Order by col1, col2, col3
这会找到 col2 总是与 'Val1' 一起出现的地方,但是这如何推广到至少有一次 'Val1' 的 Col2?
您必须仅 GROUP BY col1
并且通过条件聚合您可以获得所需的所有 col1
值:
SELECT * FROM ourDB.dbo.ourTable
WHERE col1 IN (
SELECT col1
FROM ourDB.dbo.ourTable
GROUP BY col1
HAVING COUNT(*) > 1 AND SUM(CASE WHEN col2 = 'Val1' THEN 1 END) > 0
)
ORDER BY col1, col2, col3
如果您只想要带有 col2 = 'Val1'
的行:
SELECT * FROM ourDB.dbo.ourTable
WHERE
col2 = 'Val1'
AND
col1 IN (
SELECT col1
FROM ourDB.dbo.ourTable
GROUP BY col1
HAVING COUNT(*) > 1 AND SUM(CASE WHEN col2 = 'Val1' THEN 1 END) > 0
)
ORDER BY col1, col3
下面的替代方法,最初来自同事,我修改了一些。
注意:不一定比其他(已接受的)答案更好,只是方法不同。
-- GENERIC_JOIN_WITH_SPECIFIC_COUNTS_Q_v_0.sql
USE [ourDB]
SELECT COUNT( distinct titleid) -- also could use COUNT(*)
from ourTable
WHERE
(
(1 <
(
select count( col1)
from ourTable
GROUP BY col1
HAVING (count(col1 > 1)
-- more than one col1 occurence
)
)
AND
(0 <
(
select count(*) from ourTable
WHERE( col2 = 'Val1' )
-- at least one occurence of col2 having 'Val1'
)
)
)
TSQL -- 在 table 中查找一列中有多个值且在另一列中至少有一次特定值出现的记录
如果我有: ourDB.dbo.ourTable col1 和 col2 以及 col 3
我想找到这样的事件 * col1 的值出现多次 * col2 的至少一个实例 = 'Val1' 至少一次。
TSQL -- 在 table
中查找特定事件所以开始的人会是:
Select col1, col2, col3
FROM ourDB.dbo.ourTable
having count(col1) > 1
WHERE
(col2 = 'Val1')
Group by col1, col2, col3
Order by col1, col2, col3
这会找到 col2 总是与 'Val1' 一起出现的地方,但是这如何推广到至少有一次 'Val1' 的 Col2?
您必须仅 GROUP BY col1
并且通过条件聚合您可以获得所需的所有 col1
值:
SELECT * FROM ourDB.dbo.ourTable
WHERE col1 IN (
SELECT col1
FROM ourDB.dbo.ourTable
GROUP BY col1
HAVING COUNT(*) > 1 AND SUM(CASE WHEN col2 = 'Val1' THEN 1 END) > 0
)
ORDER BY col1, col2, col3
如果您只想要带有 col2 = 'Val1'
的行:
SELECT * FROM ourDB.dbo.ourTable
WHERE
col2 = 'Val1'
AND
col1 IN (
SELECT col1
FROM ourDB.dbo.ourTable
GROUP BY col1
HAVING COUNT(*) > 1 AND SUM(CASE WHEN col2 = 'Val1' THEN 1 END) > 0
)
ORDER BY col1, col3
下面的替代方法,最初来自同事,我修改了一些。 注意:不一定比其他(已接受的)答案更好,只是方法不同。
-- GENERIC_JOIN_WITH_SPECIFIC_COUNTS_Q_v_0.sql
USE [ourDB]
SELECT COUNT( distinct titleid) -- also could use COUNT(*)
from ourTable
WHERE
(
(1 <
(
select count( col1)
from ourTable
GROUP BY col1
HAVING (count(col1 > 1)
-- more than one col1 occurence
)
)
AND
(0 <
(
select count(*) from ourTable
WHERE( col2 = 'Val1' )
-- at least one occurence of col2 having 'Val1'
)
)
)