2017-05-31 42 views
1

BUSINESSTABLE看起來像這樣的時候:DB2 SQL獲得不同價值的分組行

HOTEL_CHAIN HOTEL_LOCATION HOTEL_OWNER 
_____________________________________________________ 
Marriott  Las Vegas  Nelson 
Best Western New York   Richards 
Best Western San Francisco Smith 
Marriott  New York   Nelson 
Hilton   Boston   James 

我想在DB2數據庫組由HOTEL_CHAIN這些條目執行SQL語句。如果組合在一起的行包含相同的HOTEL_LOCATION或HOTEL_OWNER,則應保留該信息。否則,應顯示「NULL」值。例如,兩家萬豪酒店都擁有相同的所有者納爾遜,所以我想在新表格中顯示這些信息。但是,每家萬豪酒店都位於不同的位置,因此我想在該列中顯示「NULL」。

結果表(HOTELTABLE)應該是這樣的:

HOTEL_CHAIN HOTEL_LOCATION HOTEL_OWNER 
_____________________________________________________ 
Marriott  NULL    Nelson 
Best Western NULL    NULL 
Hilton   Boston   James 

我嘗試使用下面的SQL語句來實現:

INSERT INTO HOTELTABLE(HOTEL_CHAIN,HOTEL_LOCATION,HOTEL_OWNER) 
SELECT 
HOTEL_CHAIN, 
CASE COUNT(DISTINCT(HOTEL_LOCATION)) WHEN 1 THEN HOTEL_LOCATION ELSE 'NULL' END, 
CASE COUNT(DISTINCT(HOTEL_OWNER)) WHEN 1 THEN HOTEL_OWNER ELSE 'NULL' END, 
FROM BUSINESSTABLE GROUP BY HOTEL_CHAIN 

我得到一個SQL錯誤SQLCODE- 119具有條款的列或表達式無效。這似乎是在抱怨我的病例報告中的第二個HOTEL_LOCATION和第二個HOTEL_OWNER。我也嘗試使用DISTINCT(HOTEL_LOCATION),並拋出了另一個錯誤。有人可以請解釋正確的方式來編碼嗎?謝謝!

回答

3

請勿使用COUNT(DISTINCT)。使用MIN()MAX()

INSERT INTO HOTELTABLE(HOTEL_CHAIN,HOTEL_LOCATION,HOTEL_OWNER) 
    SELECT HOTEL_CHAIN, 
      (CASE WHEN MIN(HOTEL_LOCATION) = MAX(HOTEL_LOCATION) 
       THEN MIN(HOTEL_LOCATION) ELSE 'NULL' 
      END), 
      (CASE WHEN MIN(HOTEL_OWNER) = MAX(HOTEL_OWNER) 
       THEN MIN(HOTEL_OWNER) ELSE 'NULL' 
      END) 
    FROM BUSINESSTABLE 
    GROUP BY HOTEL_CHAIN; 

注:

  • 爲什麼不COUNT(DISTINCT)?它通常比MIN()MAX()貴得多,因爲它需要維護所有值的內部列表。
  • 我不認可名爲'NULL'的字符串值。似乎它是爲了引起混淆。也許只是NULL的價值本身?
0

我同意Gordon爲null(gj Gordon)。

其他方法

INSERT INTO HOTELTABLE(HOTEL_CHAIN,HOTEL_LOCATION,HOTEL_OWNER) 

select distinct f1.HOTEL_CHAIN, 
     case when f2.HasDiffLocation is not null then 'NULL' else f1.HOTEL_LOCATION end as HOTEL_LOCATION, 
     case when f3.HasDiffOwner is not null then 'NULL' else f1.HOTEL_OWNER end as HOTEL_OWNER 
from BUSINESSTABLE f1 
left outer join lateral 
(
    select 1 HasDiffLocation from BUSINESSTABLE f2b 
    where f1.HOTEL_CHAIN=f2b.HOTEL_CHAIN and f1.HOTEL_LOCATION<>f2b.HOTEL_LOCATION 
    fetch first rows only 
) f2 on 1=1 

left outer join lateral 
(
    select 1 HasDiffOwner from BUSINESSTABLE f3b 
    where f1.HOTEL_CHAIN=f3b.HOTEL_CHAIN and f1.HOTEL_OWNER<>f3b.HOTEL_OWNER 
    fetch first rows only 
) f3 on 1=1 

或這樣的:

INSERT INTO HOTELTABLE(HOTEL_CHAIN,HOTEL_LOCATION,HOTEL_OWNER) 
select distinct f1.HOTEL_CHAIN, 
ifnull(f2.result, f1.HOTEL_LOCATION) as HOTEL_LOCATION, 
ifnull(f3.result, f1.HOTEL_OWNER) as HOTEL_LOCATION, 
from BUSINESSTABLE f1 
left outer join lateral 
(
    select 'NULL' result from BUSINESSTABLE f2b 
    where f1.HOTEL_CHAIN=f2b.HOTEL_CHAIN and f1.HOTEL_LOCATION<>f2b.HOTEL_LOCATION 
    fetch first rows only 
) f2 on 1=1 

left outer join lateral 
(
    select 'NULL' result from BUSINESSTABLE f3b 
    where f1.HOTEL_CHAIN=f3b.HOTEL_CHAIN and f1.HOTEL_OWNER<>f3b.HOTEL_OWNER 
    fetch first rows only 
) f3 on 1=1