【问题标题】:Group By combined to CASE (SQL DB2)Group By 组合到 CASE (SQL DB2)
【发布时间】:2021-06-25 07:25:36
【问题描述】:

我有一个包含此列的客户数据库(示例):

ID TIMESTAMP TYP_EVEN NAME COUNTRY GENDER NBR_CHILDREN ADRESS CUSTOMER_LINKED TYP_OF_LINK
044348547 2020-09-08-02.02.21.442908 0004 NXXX CORINNE FRA 2 02 000000000
044379039 2020-07-17-11.17.55.410843 0013 00 11 RUE XXXX XXX 000000000
044379039 2020-07-21-16.45.53.485200 0004 KXXX STEPHANE FRA 1 00 000000000
044379039 2020-08-05-02.02.41.403053 0004 KXXX STEPHANE FRA 1 00 000000000
044385911 2019-01-31-02.03.22.455660 0004 SXXX PHILIPPE FRA 1 02 000000000
044385911 2020-09-18-15.46.31.387588 0004 SXXX PHILIPPE FRA 1 02 000000000
044385911 2020-09-30-02.01.45.310449 0004 SXXX PHILIPPE FRA 1 02 000000000
044385911 2020-10-01-00.06.20.341427 0013 00 19 RUE XXXX XXXX 000000000
044680501 2021-03-10-02.02.42.979297 0004 HXXX STEPHANE FRA 1 00 000000000
044680501 2021-03-10-02.02.42.980069 0013 00 22 RUE XXXX XXXX 000000000
044680501 2021-03-10-02.02.42.981083 0029 00 044680519 MARIED
044680519 2021-03-10-02.02.42.966522 0004 HXXX LIDWINE FRA 2 02 000000000
044680519 2021-03-10-02.02.42.970031 0029 00 044680501 MARIED

TYP_EVEN : 是关于每个客户 ID 的记录的事件类型,然后 OOO4 : 是关于客户的信息 (NAME, COUNTRY, GENDER, Number of children ), 0013 : 是关于 ADRESS 信息和 0029 : 是关于链接 beetwen 客户

我想按 ID 列出所有信息。我是这样进行的:

    SELECT
T1.ID,
CASE WHEN T1.TYP_EVEN = '0004' THEN T1.NAME END AS NAME,
CASE WHEN T1.TYP_EVEN = '0004' THEN T1.COUNTRY END AS COUNTRY,
CASE WHEN T1.TYP_EVEN = '0004' THEN T1.GENDER END AS GENDER,
CASE WHEN T1.TYP_EVEN = '0004' THEN T1.NBR_CHILDREN END AS NBR_CHILDREN,

CASE WHEN T1.TYP_EVEN = '0013' THEN T1.ADRESS END AS ADRESS,

CASE WHEN T1.TYP_EVEN = '0029' THEN T1.CUSTOMER_LINKED END AS CUSTOMER_LINKED,
CASE WHEN T1.TYP_EVEN = '0029' THEN T1.TYP_OF_LINK END AS TYP_OF_LINK
,T1.TIMESTAMP

FROM DB.CUSTOMERS T1

GROUP BY GROUP BY T1.ID,T1.TIMESTAMP, T1.TYP_EVEN,T1.NAME,T1.COUNTRY,T1.GENDER,T1.NBR_CHILDREN,T1.ADRESS
,T1.CUSTOMER_LINKED, T1.TYP_OF_LINK 
ORDER BY 1

结果应该是:

ID NAME COUNTRY GENDER NBR_CHILDREN ADDRESS CUSTOMER_LINKED TYP_OF_LINK
044348547 NXXX CORINNE FRA 2 02 11 RUE XXXX XXX 000000000
044379039 KXXX STEPHANE FRA 1 00 000000000
044385911 SXXX PHILIPPE FRA 1 02 19 RUE XXXX XXXX 000000000
044680501 HXXX STEPHANE FRA 1 00 22 RUE XXXX XXXX 044680519 MARIED
044680519 HXXX LIDWINE FRA 2 02 044680501 MARIED

更多信息:如果一个 ID 有 2 行具有相同的 TYP_EVEN,则通过 TIMESTAMP 选择后者。

有人可以解决这个 SQL 语句吗?

【问题讨论】:

  • “它不起作用”并没有告诉我们太多,请更加明确。此外,GROUP BY 应该与聚合一起使用,如果您想要唯一的行,请使用 DISTINCT。如果一个 id 有多个 TYP_EVEN 值,你想要什么?
  • 使用 DISTINCT 也不起作用。
  • 就像我说的,简单地说明某事不起作用是没有帮助的
  • 如果一个 ID 有多个 TYP_EVEN 值,我想将它连接到一行
  • 怎么样?您希望看到哪个值?

标签: sql db2


【解决方案1】:

这是一种做你想做的事的方法

with customers (id, timestamp, typ_even, name, country, gender, nbr_children, adress, customer_linked, typ_of_link) as (
  values
  (044348547, timestamp('2020-09-08-02.02.21.442908'), 0004, 'NXXX CORINNE', 'FRA', 2, 02, NULL, 000000000, NULL),
  (044379039, '2020-07-17-11.17.55.410843', 0013, NULL, NULL, NULL, 00, '11 RUE XXXX XXX', 000000000, NULL),
  (044379039, '2020-07-21-16.45.53.485200', 0004, 'KXXX STEPHANE', 'FRA', 1, 00, NULL, 000000000, NULL),
  (044379039, '2020-08-05-02.02.41.403053', 0004, 'KXXX STEPHANE', 'FRA', 1, 00, NULL, 000000000, NULL),
  (044385911, '2019-01-31-02.03.22.455660', 0004, 'SXXX PHILIPPE', 'FRA', 1, 02, NULL, 000000000, NULL),
  (044385911, '2020-09-18-15.46.31.387588', 0004, 'SXXX PHILIPPE', 'FRA', 1, 02, NULL, 000000000, NULL),
  (044385911, '2020-09-30-02.01.45.310449', 0004, 'SXXX PHILIPPE', 'FRA', 1, 02, NULL, 000000000, NULL),
  (044385911, '2020-10-01-00.06.20.341427', 0013, NULL, NULL, NULL, 00, '19 RUE XXXX XXXX', 000000000, NULL),
  (044680501, '2021-03-10-02.02.42.979297', 0004, 'HXXX STEPHANE', 'FRA', 1, 00, NULL, 000000000, NULL),
  (044680501, '2021-03-10-02.02.42.980069', 0013, NULL, NULL, NULL, 00, '22 RUE XXXX XXXX', 000000000, NULL),
  (044680501, '2021-03-10-02.02.42.981083', 0029, NULL, NULL, NULL, 00, NULL, 044680519, 'MARIED'),
  (044680519, '2021-03-10-02.02.42.966522', 0004, 'HXXX LIDWINE', 'FRA', 2, 02, NULL, 000000000, NULL),
  (044680519, '2021-03-10-02.02.42.970031', 0029, NULL, NULL, NULL, 00, NULL, 044680501, 'MARIED')
)
select ID,NAME,COUNTRY,GENDER,NBR_CHILDREN,ADRESS,CUSTOMER_LINKED,TYP_OF_LINK from (
  select
    id,
    last_value(name, 'IGNORE NULLS') over(partition by id order by timestamp) name,
    last_value(country, 'IGNORE NULLS') over(partition by id order by timestamp) country,
    last_value(gender, 'IGNORE NULLS') over(partition by id order by timestamp) gender,
    last_value(nbr_children, 'IGNORE NULLS') over(partition by id order by timestamp) nbr_children,
    last_value(adress, 'IGNORE NULLS') over(partition by id order by timestamp ) adress,
    last_value(customer_linked, 'IGNORE NULLS') over(partition by id order by timestamp ) customer_linked,
    last_value(typ_of_link, 'IGNORE NULLS') over(partition by id order by timestamp ) typ_of_link,
    rownumber() over(partition by id order by timestamp desc) seq
  from customers
) where seq = 1
order by id

db<>fiddle,Corinne NXXX 没有地址

【讨论】:

  • 我有这个错误:元素语法,不正确。可能的元素:(+ - ?。您确定此 SQL 代码在 DB2 数据库中工作吗?
  • @IbD 它确实使用了 DB2LUW 11.1(参见小提琴)或用于 IBMi 7.3 的 DB2(我还必须稍微修改第一行值,并且只是对我的答案进行了编辑)。您使用哪种 DB2 DBMS?哪个版本?
猜你喜欢
  • 2017-03-22
  • 1970-01-01
  • 2019-05-05
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2010-11-15
相关资源
最近更新 更多