【问题标题】:SQL: Select, dynamically created values as columnSQL:选择,动态创建的值作为列
【发布时间】:2020-10-06 01:36:31
【问题描述】:

我必须从一列中选择数据,然后将这些值显示为另一列。但问题是,在我的专栏中,总会有新数据出现,也会创建新单元格。

Product_Table:

ID   NAME
1    apple
2    orange

Selling_Table:

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

当销售表中有新日期时,我希望我的 SQL 动态创建另一个 SELLING_DATE。如您所见,当没有 SELLING_DATE 数据填充为 null 时,或者我们可以替换基本文本,如“未售出”

【问题讨论】:

标签: sql sql-server date select window-functions


【解决方案1】:

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

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)来扩展查询以处理更多日期。

【讨论】:

  • 这很好,正是我想要的。正如您提到的,如果需要,我将添加更多有条件的“max()”。谢谢。
【解决方案2】:

我真的认为以这种方式解决您的问题并不实际。

您可以尝试以下几件事:

  • 每次销售只需选择每个产品一次,即加入它们,这实际上与将 selling_table 中的 ID 替换为产品名称几乎相同。这应该会给你类似的东西:
  PRODUCT    SELLING DATE
  apple      2020-06-12
  apple      2020-05-12
  apple      2020-07-23
  orange     2020-01-01

  • 您可以尝试同时选择每个产品的所有日期并将它们显示为字符串(如果您是 SQL 新手,可能需要进行一些研究和工作)。 This answer do a somewhat similar question 可能对您有所帮助。

  • 也许您是从某个更高级别的程序调用它?例如,如果您使用 C#,您可能可以轻松地操纵任何结果,例如使用LINQ。不过,这一切都取决于更大的图景,以及您希望如何呈现最终结果。

为此,如果您可以使用有关您的整体架构的更多信息来更新您的问题,那将会很有用。

【讨论】:

  • 我正在使用 devexpress xtract 报告。我必须使用数据集从 SQL 中设置我的数据。我需要我确切地说的。还是谢谢你。
  • 我明白了。我对 Devexpress Extract 不熟悉,但基于简单的谷歌搜索,似乎在展示数据之前可能有用于操作数据的选项。例如:docs.devexpress.com/Dashboard/118802/winforms-designer/…。无论如何,我都会尝试对此进行调查,看看是否可以根据公共字段(product_id 或`product)对数据进行分组。
猜你喜欢
  • 1970-01-01
  • 2017-03-14
  • 2021-08-26
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 2010-11-18
  • 2012-06-11
  • 2021-10-20
相关资源
最近更新 更多