簡體   English   中英

如何根據一行中的值使一個標識符的所有值都相同?

[英]How can I make all values of one identifier the same based a on value in a row?

SELECT a.IDENTIFIER,
    a.NAME,
    a.CATEGORY,
    b.IDENTIFIER_TYPE,
    b.NAME,
    CASE
        WHEN b.IDENTIFIER_TYPE = 111 THEN 'PRESENT'
        ELSE 'NOT PRESENT'
    END AS HAS111
FROM TABLE_A a
LEFT JOIN IDENTIFIER_TYPE_TABLE b ON a.IDENTIFIER = b.IDENTIFIER
WHERE a.IDENTIFIER IN (1, 2, 3, 4)
;

這是我正在使用的代碼,我得到的數據是:

數據樣本接收

但我希望數據看起來像這樣:

我需要的數據

基本上,我需要這個:

 td { text-align: center; }
 <table> <tbody> <tr> <td>IDENTIFIER</td> <td>NAME</td> <td>CATEGORY</td> <td>IDENTIFIER_TYPE</td> <td>HAS111</td> </tr> <tr> <td>123</td> <td>item123</td> <td>1</td> <td>778</td> <td>not present</td> </tr> <tr> <td>123</td> <td>item123</td> <td>1</td> <td>127</td> <td>not present</td> </tr> <tr> <td>123</td> <td>item123</td> <td>1</td> <td>137</td> <td>not present</td> </tr> <tr> <td>456</td> <td>item456</td> <td>1</td> <td>122</td> <td>not present</td> </tr> <tr> <td>456</td> <td>item456</td> <td>2</td> <td>87</td> <td>not present</td> </tr> <tr> <td>456</td> <td>item456</td> <td>2</td> <td>444</td> <td>not present</td> </tr> <tr> <td>789</td> <td>item789</td> <td>2</td> <td>289</td> <td>present</td> </tr> <tr> <td>789</td> <td>item789</td> <td>2</td> <td>111</td> <td>present</td> </tr> <tr> <td>789</td> <td>item789</td> <td>2</td> <td>75</td> <td>present</td> </tr> </tbody> </table>

您看到 item789 在其中一行中有 111,因此我需要所有其他行為 item789 說“存在”。 其他人沒有111,所以他們現在沒有111。 這有意義嗎?

您可以使用EXISTS

SELECT a.IDENTIFIER, a.NAME, a.CATEGORY, b.IDENTIFIER_TYPE, b.NAME,
       (CASE WHEN EXISTS (SELECT 1 
                          FROM IDENTIFIER_TYPE_TABLE b1 
                          WHERE a.IDENTIFIER = b1.IDENTIFIER AND 
                                b1.IDENTIFIER_TYPE = 111
                         ) 
             THEN 'PRESENT' ELSE 'NOT PRESENT' 
        END) AS HAS111
FROM TABLE_A a LEFT JOIN 
     IDENTIFIER_TYPE_TABLE b 
     ON a.IDENTIFIER = b.IDENTIFIER
WHERE a.IDENTIFIER IN (1, 2, 3, 4);

使用 window 函數:

SELECT a.IDENTIFIER, a.NAME, a.CATEGORY,
       b.IDENTIFIER_TYPE, b.NAME,
       (CASE WHEN b.num_111 > 0 THEN 'PRESENT'
             ELSE 'NOT PRESENT'
        END) AS HAS111
FROM TABLE_A a LEFT JOIN
     (SELECT b.*, 
             SUM(CASE WHEN b.IDENTIFIER_TYPE = 111 THEN 1 ELSE 0 END) OVER (PARTITION BY b.IDENTIFIER) as num_111
      FROM IDENTIFIER_TYPE_TABLE b
     ) b
     ON a.IDENTIFIER = b.IDENTIFIER
WHERE a.IDENTIFIER IN (1, 2, 3, 4);

或者不使用子查詢:

SELECT a.IDENTIFIER, a.NAME, a.CATEGORY,
       b.IDENTIFIER_TYPE, b.NAME,
       (CASE WHEN SUM(CASE WHEN b.IDENTIFIER_TYPE = 111 THEN 1 ELSE 0 END) > 0 THEN 'PRESENT'
             ELSE 'NOT PRESENT'
        END) AS HAS111
FROM TABLE_A a LEFT JOIN
     IDENTIFIER_TYPE_TABLE b
     ON a.IDENTIFIER = b.IDENTIFIER
WHERE a.IDENTIFIER IN (1, 2, 3, 4);

你會想要再次離開加入你的桌子只是為了禮物:

SELECT a.IDENTIFIER,
    a.NAME,
    a.CATEGORY,
    b.IDENTIFIER_TYPE,
    b.NAME,
    iif( b.identifier is null,'Not Present','Present') as HAS111
FROM TABLE_A a
   left join (Select distinct identifier table_A where type = 111) b on a.identifier=b.identifier

暫無
暫無

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

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