1

我一直在为这个问题而烦恼。我正在使用现有数据集,需要从表 A 中的列中删除所有空值并将它们分流,以便它们像表 B 中一样排序

我需要与 Coalesce 等效的东西,但要检索第 n 个值,这样我就可以得到像表 B 中那样排序的结果

是)我有的:

表 A

Name CURRENT OCT12 SEPT12 AUG12 JUL12 JUN12  MAY12 APR12
---------------------------------------------------------
A    NULL    NULL  Aug-12 NULL  NULL  Jun-12 NULL  Apr-12
B    Nov-12  NULL  Aug-12 NULL  Jul-12Jun-12 NULL  Apr-12

我需要的:

表 B

Name Change1 Change2 Change3 Change4 Change5 Change6
----------------------------------------------------
A    Aug-12  Jun-12  Apr-12  NULL    NULL    NULL   
B    Nov-12  Aug-12  Jul-12  Jun-12  Apr-12  NULL

代码方面,它会是这样的:

Select

first non-null value as Change1  
,second non-null value as Change2  
,third non-null value as Change3  
,fourth non-null value as Change4  
,fifth non-null value as Change5...etc..  

from Table_A

我正在使用 MySQL,但我不知道如何引用第 n 个非空值以便将它们调用到 Table_B

有没有人有任何想法?

4

2 回答 2

0

我不确定我是否会推荐使用此解决方案...数据标准化始终是更好的选择,但我想使用带有一些字符串函数的普通 SQL 来回答。此查询应返回您要查找的内容:

SELECT
  Name,
  Changes,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 1)), ',', 1)) as Change1,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 2)), ',', 1)) as Change2,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 3)), ',', 1)) as Change3,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 4)), ',', 1)) as Change4,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 5)), ',', 1)) as Change5,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 6)), ',', 1)) as Change6
FROM (
  SELECT
    Name,
    CONCAT_WS(',', CURRENT, OCT12, SEPT12, AUG12, JUL12, JUN12, MAY12, APR12, ',') as Changes
  FROM
    TableA
) s

我将所有值连接在一个逗号分隔的字符串中,字符串末尾有两个逗号(一个逗号就足够了,但是放两个更容易忽略最后一个......),因为我' m 使用 CONCAT_WS 它将自动跳过空值,并且生成的字符串将类似于Aug-12,Jun-12,Apr-12,,.

然后在外部查询中,我使用 SUBSTRIG_INDEX 提取字符串的第 n 个元素。我建议标准化您的数据库,但如果您需要快速修复,此解决方案可能是一个很好的起点。

看到它在这里工作。

请注意,我没有返回没有更改的 NULL 值,而是返回空字符串。如果需要,可以更改此设置。

于 2013-01-29T09:03:52.910 回答
0

如果您不想使用字符串函数,您可以使用 unpivot 和行号分区尝试此 sql:

CREATE TABLE #TableA
  ( 
    "Name" VARCHAR(10),
    "CURRENT" VARCHAR(10),
    OCT12 VARCHAR(10),
    SEPT12 VARCHAR(10),
    AUG12 VARCHAR(10),
    JUL12 VARCHAR(10),
    JUN12 VARCHAR(10),
    MAY12 VARCHAR(10),
    APR12 VARCHAR(10)
  ) 

INSERT INTO #TableA
  ("Name", "CURRENT", OCT12, SEPT12, AUG12, JUL12, JUN12, MAY12, APR12)
VALUES
  ('A', NULL, NULL, 'Aug-12', NULL, NULL, 'Jun-12', NULL, 'Apr-12'),
  ('B', 'Nov-12', NULL, 'Aug-12', NULL, 'Jul-12', 'Jun-12', NULL, 'Apr-12')

SELECT * FROM #TableA;



Select "Name",
    Min(Case row_num When 1 Then data End) Change1,
    Min(Case row_num When 2 Then data End) Change2,
    Min(Case row_num When 3 Then data End) Change3,
    Min(Case row_num When 4 Then data End) Change4,
    Min(Case row_num When 5 Then data End) Change5,
    Min(Case row_num When 6 Then data End) Change6
From
(
    select "Name",data,DBColumnName, 
        ROW_NUMBER() OVER (PARTITION BY "Name" ORDER BY "Name") row_num 
    From #TableA
    unpivot (data for DBColumnName in ("CURRENT",OCT12,SEPT12,AUG12,JUL12,JUN12,MAY12,APR12) ) as z
) TableB
group by "Name";

参考:

--没有聚合函数的 TSQL Pivot

-- https://www.sqlservertutorial.net/sql-server-window-functions/sql-server-row_number-function/

-- https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-ver15

于 2020-11-20T04:15:32.217 回答