【问题标题】:T-SQL Query - Help RequiredT-SQL 查询 - 需要帮助
【发布时间】:2011-07-02 16:43:58
【问题描述】:

我有两张桌子 A 和 B;

Table A:
Cust_ID, Col_A, Col_B
1001, 1, 2
1002, 3, 4
1003, 2, 1
1004, 4, 3

Table B:
Col_A_Weight, Col_B_Weight
0.1111111, 0.22222

我要做的是使用 T-SQL 创建一个新的表 C,其中

Output = Col_A*Col_A_Weight + Col_B*Col_B_Weight

表 C:

Cust_ID, Output
1001, 1*0.1111111 + 2*0.22222 
1002, 3*0.1111111 + 4*0.22222
1003, 2*0.1111111 + 1*0.22222
1004, 4*0.1111111 + 3*0.22222

所以最终的表 C 是

Cust_ID Output
1001, 0.5555511
1002, 1.2222133
1003, 0.4444422
1004, 1.1111044

鉴于有 200 个 Col_A、Col_B、Col_C、Col_D 等和相应的权重列,如何使用巧妙的连接以便动态引用这些列(假设它们在两个表中对应)。由于表 B 没有 Cust_ID 字段,这使得它有点棘手。

如何做到这一点?

【问题讨论】:

  • 表B是不是只有一行?
  • @anivas:是的,表 B 将只包含一行。
  • 为什么要“巧妙连接”以便“动态引用”列 - 这样您就不必输入列名?是不是因为您会不断将 Col_n 列添加到 A 并将相应的 Col_n_Weight 列添加到 B?
  • 是的,还有另一个应用程序会不时更改列数。这就是为什么我需要一个“聪明的加入”。

标签: sql sql-server sql-server-2005 sql-server-2008 join


【解决方案1】:
USE tempdb;
GO

CREATE TABLE dbo.A
(
    Cust_ID INT PRIMARY KEY,
    Col_A INT,
    Col_B INT,
    Col_C INT,
    Col_D INT,
    Col_E INT
);

INSERT dbo.A
    SELECT 1001, 1, 2, 2, 2, 2
    UNION SELECT 1002, 3, 4, 3, 3, 3
    UNION SELECT 1003, 2, 1, 5, 2, 1
    UNION SELECT 1004, 4, 3, 2, 3, 4;

CREATE TABLE dbo.B
(
    Col_A_Weight DECIMAL(10,9),
    Col_B_Weight DECIMAL(10,9),
    Col_C_Weight DECIMAL(10,9),
    Col_D_Weight DECIMAL(10,9),
    Col_E_Weight DECIMAL(10,9)
);

INSERT dbo.B
    SELECT 0.1111111, 0.22222, 0.3333, 0.444, 0.55;

DECLARE @sql NVARCHAR(MAX) = N'IF OBJECT_ID(''dbo.C'') IS NOT NULL
BEGIN
    DROP TABLE dbo.C;
END
SELECT A.Cust_ID, Output = ';

SELECT @sql += 'B.' + name + '*' 
    + REPLACE(name, '_Weight', '') + ' + '
FROM sys.columns 
WHERE [object_id] = OBJECT_ID('dbo.B');

SELECT @sql = LEFT(@sql, LEN(@sql)-2)
    + ' INTO dbo.C
        FROM dbo.A AS A
        CROSS JOIN dbo.B AS B;';

EXEC sp_executeSQL @sql;

SELECT * FROM dbo.C;

GO
DROP TABLE dbo.A, dbo.B;

【讨论】:

    【解决方案2】:

    我相信您正在寻找交叉连接,例如

    Select 
    CustID,
    TableA.Col_A*TableB.Col_A_Weight +
    TableA.Col_B*TableB.Col_B_Weight +
    TableA.Col_C*TableB.Col_C_Weight
    From TableA
    Cross Join TableB
    

    【讨论】:

    • 表中的列数可能会不时变化。所以我正在寻找某种通用解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2016-07-26
    • 1970-01-01
    相关资源
    最近更新 更多