sql:选择动态创建的值作为列

6pp0gazn  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(360)

我必须从一列中选择数据,然后将这些值显示为另一列。但问题是,在我的专栏里,总是会有新的数据出现,新的细胞被创造出来。
产品目录:

ID   NAME
1    apple
2    orange

销售表格:

ID   PRODUCT_ID   DATE
1    1            2020-06-12
2    1            2020-05-03
3    2            2020-01-01
4    1            2020-07-23

我想要什么

NAME   SELLING_DATE_1   SELLING_DATE_2   SELLING_DATE_3
APPLE  2020-06-12       2020-05-03       2020-07-23
ORANGE 2020-01-01       NULL             NULL

当selling表中有一个新日期时,我希望我的sql动态地创建另一个selling表。正如您所注意到的,如果没有用null填充的销售日期数据,或者我们可以替换基本文本,如“not sell”

3qpi33ja

3qpi33ja1#

可以使用窗口函数和条件聚合:

select
    name,
    max(case when rn = 1 then date end) selling_date_1,
    max(case when rn = 2 then date end) selling_date_2,
    max(case when rn = 3 then date end) selling_date_3
from (
    select p.*, s.date, row_number() over(partition by p.id order by s.date) rn
    from product_table p
    inner join selling_table s on s.product_id = p.id
) t
group by id, name

可以用更多的列(即更多的条件列)展开查询 max() s) 处理更多的约会。

vof42yt1

vof42yt12#

我真的认为那样解决你的问题是不实际的。
你可以尝试以下几点:
每次销售只需选择一个产品,即加入它们,实际上,这几乎等同于替换产品中的id selling_table 产品名称。这会给你一些类似的东西:

PRODUCT    SELLING DATE
  apple      2020-06-12
  apple      2020-05-12
  apple      2020-07-23
  orange     2020-01-01

您可以尝试同时选择每个产品的所有日期,并将它们显示为字符串(如果您是sql新手,则可能需要进行一些研究和工作)。这个答案做一个有点类似的问题可能会对你有所帮助。
也许你是从某个更高层次的程序中调用这个?例如,如果您使用c#,您可能可以很容易地操纵使用linq得到的任何结果。不过,这完全取决于大局如何,以及你想如何呈现最终结果。
为此,如果您可以用有关总体架构的更多信息来更新您的问题,这将非常有用。

相关问题