【问题标题】:One Table, 2 Columns - out of 2 Tables一个表,2 列 - 2 个表
【发布时间】:2020-01-09 08:02:58
【问题描述】:

我需要你的帮助。

我尝试合并我的表格,以便它们只生成一个包含 2 列的表格。

table1:产品

ID_Product | Name
1          | Test
2          | Test2
3          | Test3
4          | Test4

table2:Purchase_Header

ID_Header | Number | Date
1         | 100001 | 2020-01-03
2         | 100002 | 2020-01-02
3         | 100003 | 2020-01-03

table3:Purchase_Line

ID_Line | ID_Header | ID_Product | Price
1       | 1         | 1          | 0,5
2       | 1         | 2          | 0,6
3       | 1         | 3          | 0,7
4       | 2         | 1          | 0,8
5       | 2         | 2          | 0,9
6       | 2         | 4          | 1,0
7       | 3         | 1          | 0,3
8       | 3         | 2          | 0,2
9       | 3         | 3          | 0,1

加入:

  • 产品 | ID_Product on Purchase_Line | ID_产品
  • Purchase_Line | ID_Header 开启 Purchase_Header | ID_Header

目标:

  • 1 表 2 列 -> ID_Product 和 Price
  • 列 ID_Product -> 表产品中的所有 ID_Product -> 或至少有价格的 ID
  • 列价格 -> ID_Product 列中每个 ID最后购买(最后日期)的最低价格

有可能:

  • 一天购买了不止一次产品
  • 同一天价格不同
ID_Line | ID_Header | ID_Product | Price | Date
1       | 1         | 1          | 0,5       |*2020-01-03*
2       | 1         | 2          | 0,6       |*2020-01-03*
3       | 1         | 3          | 0,7       |*2020-01-03*
4       | 2         | 1          | 0,8       | 2020-01-02
5       | 2         | 2          | 0,9       | 2020-01-02
6       | 2         | 4          | **1,0**   |*2020-01-02*
7       | 3         | 1          | **0,3**   |*2020-01-03*
8       | 3         | 2          | **0,2**   |*2020-01-03*
9       | 3         | 3          | **0,1**   |*2020-01-03*
  • 购买产品的最后日期 -> ID_Product 1|2|3 为 2020-01-03,ID_Product 4 为 2020-01-02
  • 本日最低价

结果应该是这样的:

ID_Product | Price
1          | 0,3
2          | 0,2
3          | 0,1
4          | 1,0

希望你能帮助我

问候 埃里克


编辑:25.06.2020

您好,我自己或下面的脚本似乎有误。

如上所述,我有两张桌子。 CSV 链接如下。

Purchase_header.csv

Purchase_line.csv

当我现在运行 T_SQL 脚本时

```
select distinct l.id_product, min(price)
from purchase_line as l
    inner join purchase_header as h on l.id_header = h.id_header
where budat in (select max(h.budat) as [date] from purchase_line as l
inner join purchase_header as h on l.id_header = h.id_header
    where h.ktyp = N'(Invoice)'            
    group by l.id_product)
group by l.id_product
```

我收到 id_product (3232,2,0) 的价格 660.0。

似乎价格取决于 2020 年 4 月 27 日的标题(较旧的日期,最低价格)而不是 2020 年 6 月 11 日(较新的日期,价格较高),我不知道为什么!脚本应使用最新的标头,当同一天有 2 个标头时,选择最低价格。

有人看到我的错误吗?

问候埃里克

【问题讨论】:

  • 请阅读tsql tag info上关于如何编写一个好的T-Sql问题和edit你的问题的说明。
  • 你的第二句话不应该是 2 列而不是 2 行吗?
  • @DávidLaczkó 你是对的,谢谢。已编辑
  • “0,3”的价格是多少?这意味着您必须将数字存储为字符?但我不知道那是什么意思。
  • 看来,我犯了一些错误,或者代码没有按应有的方式工作。我更新了帖子。

标签: sql-server tsql


【解决方案1】:

使用FIRST_VALUE()窗口函数:

select distinct 
  p.ID_Product, p.Name, 
  first_value(pl.Price) over (partition by p.ID_Product order by ph.date desc, pl.Price) Price
from Product p
inner join Purchase_Line pl on pl.ID_Product = p.ID_Product
inner join Purchase_Header ph on pl.ID_Header = ph.ID_Header

请参阅demo
结果:

> ID_Product | Name  | Price
> ---------: | :---- | ----:
>          1 | Test  |  0.30
>          2 | Test2 |  0.20
>          3 | Test3 |  0.10
>          4 | Test4 |  1.00

【讨论】:

    【解决方案2】:

    查看代码后,我意识到它不是确定性的,如果以更低的价格添加更早的购买日期,结果会不一致 更新代码 + slqfiddle 链接如下:

    select distinct l.id_product, min(price)
    from purchase_line as l
        inner join purchase_header as h on l.id_header = h.id_header
    where date in (select max(h.date) as [date] from purchase_line as l
    inner join purchase_header as h on l.id_header = h.id_header
        group by l.id_product)
    group by l.id_product
    

    http://sqlfiddle.com/#!18/8b2a54/1/0

    【讨论】:

    • 附注我在这里可能不完全正确,因为这个问题“有点”令人困惑,但会接受任何批评。
    • 他不希望日期只显示 id_product 和价格。删除最大日期,我认为这正是他想要的
    • 看来,我犯了一些错误,或者代码没有按应有的方式工作。我更新了帖子。
    猜你喜欢
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    相关资源
    最近更新 更多