簡體   English   中英

基於列2 SQL Server的列1的不同值

[英]Different values of column 1 based on column 2 SQL Server

我有一個帶有IDVal列的表。 對於每個ID值,我們可以具有相同或不同的Val值。

ID  Val
1   A
1   NULL
2   00
2   00
2   00
2   00
3   00
3   A
4   A
5   00
5   00
5   A
6   A
6   A
6   NULL
6   00

從上表中,我正在尋找在Val列中具有不同值的ID。 如果對於任何給定的ID,Val列的所有值都相同,則不應得出結果。

因此結果將是類似的。

D   Val
1   A
1   NULL
3   00
3   A
5   00
5   00
5   A
6   A
6   A
6   NULL
6   00

Id 2不應出現在結果中,因為對於Id 2,Val列具有相同的數據。 同樣,由於ID 4只有一行,因此不會出現ID 4的結果。

對於每個ID,如果我們在Val列中有多個值,那么它應該顯示在結果中。

謝謝您的幫助!

對於滿足具有不同值條件的ID:

select id
from t
group by id
having min(id) <> max(id);

然后可以將其合並到查詢中,如下所示:

select t.*
from t join
     (select id
      from t
      group by id
      having min(id) <> max(id)
     ) tt
     on t.id = tt.id;

或者,您可以使用窗口功能:

select t.id, t.val
from (select t.*,
             min(val) over (partition by id) as minval,
             max(val) over (partition by id) as maxval
      from t
     ) t
where minval <> maxval;

嘗試這個:

SELECT ID, Val
FROM mytable 
WHERE ID IN (SELECT ID
             FROM mytable
             GROUP BY ID
             HAVING COUNT(DISTINCT CASE 
                                     WHEN Val IS NULL THEN '' 
                                     ELSE Val
                                   END) > 1

我假設Val字段是VARCHAR類型,並且可以是NULL<> ''

通過三個步驟構建查詢:

  1. 選擇不同的值id,val(以確保您將獲得null安全計數)
  2. 計算每個ID的不同值
  3. 顯示源表中的結果

嘗試使用內部選擇而不是子選擇來加快查詢速度。

解決方案寫在下面的查詢中:

SELECT
    t.*
FROM
    -- select only ids with distinct count > 1
    (
        SELECT
            id
        FROM
            --  select distinct values to ensure your count of null values is real
            (
                SELECT DISTINCT
                    id, val
                FROM
                    t
            ) AS td
        GROUP BY
            id
        HAVING
            COUNT(*) > 1
    ) AS tc
-- join the source table
INNER JOIN
    t
ON
    t.id = tc.id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM