T-SQL Query - требуется помощь - PullRequest
1 голос
/ 02 июля 2011

У меня есть две таблицы 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

Я пытаюсь создать новую таблицу C с использованием T-SQL, где

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, это немного усложняет задачу.

Как это можно сделать?

Ответы [ 2 ]

2 голосов
/ 02 июля 2011
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;
0 голосов
/ 02 июля 2011

Я полагаю, вы ищете перекрестное соединение, например

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
...