我的源資料如下
DECLARE @t1 AS tABLE
(
sn int,
site varchar(max),
cond varchar(max),
val int(max)
)
INSERT INTO @t1
SELECT *
FROM[/span
(VALUES)
(1, 'site1', 'X', 100) 。
(2, 'site1', 'Y', 200) 。
(3, 'site1', 'Z', 300) 。
(1, 'site2', 'X', 100) 。
(2, 'site2', 'Y', 200) 。
(3, 'site2', 'Z', 300),
(1, 'site3', 'X', 100) 。
(2, 'site3', 'P', 200) 。
(3, 'site3', 'Q', 300) 。
(1, 'site4', 'A', 100) 。
(2, 'site4', 'Y', 200) 。
(3, 'site4', 'Q', 300) 。
(1, 'site5', 'E', 100) 。
(1, 'site5', 'E', 1000) 。
(2, 'site5', 'F', 200) 。
(3, 'site5', 'G', 300)
) t (a, b, c, d)
我試圖創建一個計算列,它將測驗每一組站點,是否所有的條件都只有X,Y或Z
如果每個站點的所有值都不是X、Y或Z,那么它就不是想要的。我想要的結果是:
| site | cond | test |
|-------|------|------|
| site1 | X | 1 |
| site1 | Y | 1 |
| site1 | Z | 1 | Z
| site2 | X | 1 |
| site2 | Y | 1 |
| site2 | Z | 1 | Z
| site3 | X | 0 |
| site3 | p | 0 |
| site3 | Q | 0 | Q
| site4 | A | 0 |
| site4 | Y | 0 | Y
| site4 | Q | 0 | Q
| site5 | E| 0 |
| site5 | E| 0 |
| site5 | F | 0 |
| site5 | G| 0 |
到目前為止,我嘗試了這個方法,但它并沒有得到我想要的東西。有沒有什么過濾技術可以在SQL中只測驗值的集合?
SELECT。
*,
MAX(CASE)
WHEN cond = 'X'
OR cond = 'Y'
OR cond = 'Z'
THEN 1
ELSE 0
END) OVER (PARTITION BY site) AS 測驗
FROM[/span]測驗
@t1
uj5u.com熱心網友回復:
你的一些測驗資料有3個以上的站點,所以在假設你可以有3個以上的共享條件X/Y/Z,或者想排除一個有更多的站點,例如X/Y/Z/Q,那么我懷疑你需要將cond與站點的總數進行比較,就像這樣:
select site, cond,
串列中的 "Iif(
Sum(case when cond in ('X'/span>, 'Y'/span>, 'Z'/span>) then 1 end) over (partition by site)
= Count(*) over(partition by site)。1, 0)
) as test
from t1
uj5u.com熱心網友回復:
我們可以為此使用視窗函式,來動態地確定結果中的test列。 這個解決方案假設(site, cond)對是唯一的。 如果這不是真的,可能需要更多的邏輯。
SELECT *
, CASE WHEN
COUNT(CASE WHEN cond IN ('X'/span>, 'Y'/span>, 'Z'/span>) THEN 1 END) OVER (PARTITION BY site) = 3
AND COUNT(*) OVER (PARTITION BY site) = = 3 THEN 1 ELSE 0 END AS test
FROM t1
;
調整后,測驗X、Y和Z,并且只測驗這些。
這里是測驗案例:
uj5u.com熱心網友回復:
如果我理解正確的話:
select t1.*,
1 - max(case when cond not in ('X'/span>, 'Y'/span>, 'Z'/span>) then 1 else 0 end) as flag
from t1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/311063.html
標籤:

