【问题标题】:Compare between columns on different tables比较不同表上的列
【发布时间】:2015-09-10 13:20:59
【问题描述】:

我需要编写 T-SQL 代码来比较需要在 T2.StageFromT2.StageTo 之间的 T1.PercentComplete。然后获取T2.Bonus_Prec 并加入 T1

T1:

T2:

T2.Bonus_Prec 的期望结果是 0.02,因为 T1.Percent_Complete.27,介于 01 之间。

问题是每个Key 可以在1-6 之间有不同的T2.StageID
如果Key 只有一个T2.StageID,它将为 0。(让我知道只有 1 个奖励选项的快速方法) 如果它有超过 1 它将从 1 开始。(如果需要,可以更改)

T1:

DROP TABLE T1; CREATE TABLE T1( Key VARCHAR(10) NOT NULL PRIMARY KEY ,Percent_Complete_ NUMBER(16,2) NOT NULL ); INSERT INTO T1(Key,Percent_Complete_) VALUES ('Key Vendor',Percent_Complete); INSERT INTO T1(Key,Percent_Complete_) VALUES ('***',0.27);

T2:
DROP TABLE T2; CREATE TABLE T2( Key VARCHAR(50) NOT NULL ,StageID INT NOT NULL ,Stage_From NUMERIC(10,2) NOT NULL ,Stage_To NUMERIC(8,2) NOT NULL ,Stage_Bonus_Prec NUMERIC(16,2) NOT NULL ); INSERT INTO T2(Key,StageID,Stage_From,Stage_To,Stage_Bonus_Prec) VALUES ('Key',Stage_Id,Stage_From,Stage_To,Stage_Bonus_Prec); INSERT INTO T2(Key,StageID,Stage_From,Stage_To,Stage_Bonus_Prec) VALUES ('***',1,0,0.8,0.02); INSERT INTO T2(Key,StageID,Stage_From,Stage_To,Stage_Bonus_Prec) VALUES ('***',2,0.8,1,0.035); INSERT INTO T2(Key,StageID,Stage_From,Stage_To,Stage_Bonus_Prec) VALUES ('***',3,1,-1,0.05);

输出:
+-----+-------------------+--------------------+ | Key | Percent_Complete | [Stage_Bonus_Prec] | +-----+-------------------+--------------------+ | *** | 0.27 | 0.02 | +-----+-------------------+--------------------+

这是一个带有这些值的SQLFiddle

【问题讨论】:

  • 这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • 我希望现在好多了。谢谢
  • 没有什么比发布消耗性 ddl 和示例数据更好的了。这与消耗性 ddl 和示例数据完全不同。这里的挑战是我们不知道你想做什么,我们不知道你的桌子,我们看不到你的屏幕。我们唯一知道的是您发布的内容,此时几乎什么都不是。您是否注意到我引用的文章中关于发布示例数据的创建表语句和插入语句的部分?如果您这样做,我们可以提供帮助,否则我们无能为力。
  • 这就是我更改帖子并添加 2 个表格图像的原因,这就是我所看到的,这就是现在的所有数据。
  • 您没有添加两个表。您添加了两张图片。我们不知道任何东西的数据类型,更重要的是我们不能在我们的系统上运行它,所以我们可以创建查询。即使这样,我们也不知道您对基于这两个表的输出的期望是什么,因为没有发布任何规则。

标签: sql sql-server tsql compare


【解决方案1】:

目前尚不清楚您要做什么,但我尝试了。请注意,我还更正了您发布的 ddl 和示例数据的一些问题。

if OBJECT_ID('T1') is not null
    drop table T1

CREATE TABLE T1(
   KeyVendor VARCHAR(10) NOT NULL PRIMARY KEY
  ,PercentComplete VARCHAR(16) NOT NULL
);
INSERT INTO T1(KeyVendor,PercentComplete) VALUES ('***','0.27');

if OBJECT_ID('T2') is not null
    drop table T2

CREATE TABLE T2(
   MyKey    VARCHAR(50) NOT NULL
  ,StageID INT  NOT NULL
  ,Stage_From NUMERIC(10,0) NOT NULL
  ,Stage_To NUMERIC(8,0) NOT NULL
  ,Stage_Bonus_Prec NUMERIC(16,3) NOT NULL
);
INSERT INTO T2(MyKey,StageID,Stage_From,Stage_To,Stage_Bonus_Prec) VALUES ('***',1,0,0.8,0.02);
INSERT INTO T2(MyKey,StageID,Stage_From,Stage_To,Stage_Bonus_Prec) VALUES ('***',2,0.8,1,0.035);
INSERT INTO T2(MyKey,StageID,Stage_From,Stage_To,Stage_Bonus_Prec) VALUES ('***',3,1,-1,0.05);

select * 
from T1
cross apply 
(
    select top 1 Stage_Bonus_Prec 
    from T2 
    where t1.PercentComplete >= t2.Stage_Bonus_Prec 
        and t1.KeyVendor = t2.MyKey 
    order by Stage_Bonus_Prec
) x

【讨论】:

  • 谢谢。我会试试这个并在这里报告。如果还不清楚,我会尝试做那个简单的。我有奖金等级(在 1-6 之间,可以是 1-2 或 1-4)的奖金表(T2)和绩效表(T1)我想根据绩效 T1 @ 从表中获取 Stage_Bonus_Prec 987654323@
【解决方案2】:

也尝试一下,因为它仍然有点不清楚:

SELECT t1.percent_complete, t2.Stage_Bonus_Prec
FROM T1 INNER JOIN T2 
  ON T1.[key vendor] = T2.[Key] AND
    T1.[percent_complete] BETWEEN T2.Stage_From AND T2.Stage_To

[Key Vendor][Key] 上加入T1T2,并使用BETWEEN 运算符查找介于Stage_FromStage_To 之间的percent_complete 值。

我想我仍然缺少一些东西,因为我仍然对 ***Key 值在您想要的结果中来自哪里感到困惑。

SQLFiddle of this in action,基于稍微修正的 DDL 版本(您将字段名称放在他们自己的数据记录中,我已将其删除,因为它们不属于那里)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    相关资源
    最近更新 更多