Sql 查询按科目数分配成本
Part和Recv_Acct在两个表(A、B)中都是公共(联接键)列。需要查询表B记录应绑定到A的位置。按顺序发送。检查附加的最终输出屏幕截图 表ASql 查询按科目数分配成本,sql,sql-server,tsql,Sql,Sql Server,Tsql,Part和Recv_Acct在两个表(A、B)中都是公共(联接键)列。需要查询表B记录应绑定到A的位置。按顺序发送。检查附加的最终输出屏幕截图 表A CREATE TABLE [dbo].[a]( [id] [int] NOT NULL, [part] [nvarchar](150) NOT NULL, [Recv_acct] [nvarchar](30) NULL, [Send_acct] [nvarchar](30) NULL ) ON [PRIMARY]
CREATE TABLE [dbo].[a](
[id] [int] NOT NULL,
[part] [nvarchar](150) NOT NULL,
[Recv_acct] [nvarchar](30) NULL,
[Send_acct] [nvarchar](30) NULL
) ON [PRIMARY]
GO
INSERT INTO a([id],[part],[Recv_acct],[Send_acct])
VALUES(1,'QR1','6722','307131')
,(2,'QR1','6722','22965')
,(3,'QR2','6700','12345')
,(4,'QR2','6700','54321')
Go
**Table B**
CREATE TABLE [dbo].[b](
[Recv_acct] [varchar](30) NOT NULL,
[customer] [varchar](60) NULL,
[invoice_number] [varchar](40) NOT NULL,
[PART] [varchar](100) NOT NULL,
[COST] [decimal](38, 6) NULL
) ON [PRIMARY]
GO
INSERT INTO b([Recv_acct],[customer],[invoice_number],[PART],[COST])
VALUES('6722','ABC','3310','QR1','10500.00')
,('6722','ABC','5969','QR1','22400.00')
,('6722','ABC','5974','QR1','2100.00')
,('6722','ABC','8469','QR1','20300.00')
,('6722','ABC','8470','QR1','2100.00')
,('6700','DEF','5974','QR2','100.00')
,('6700','DEF','8469','QR2','2300.00')
,('6700','DEF','8470','QR2','2000.00')
最终输出屏幕截图可用这将解决您的问题:
SELECT b.*
, a.Send_acct
FROM table_b AS b
LEFT JOIN table_a AS a
ON b.PART = a.part
AND b.Recv_acct = a.Recv_acct
由于预期结果的推导没有提到任何逻辑,因此假设数据需要在列
发票编号
上进行排序,您可以使用行编号()
和%(mod)
获得与您的结果相近的结果
SELECT
PART,
Recv_acct,
customer_Name,
invoice_number,
Cost,
Send_Acct
FROM (SELECT
t2.PART,
t2.Recv_acct,
t2.customer_Name,
t2.invoice_number,
t2.Cost,
t1.Send_Acct,
ROW_NUMBER() OVER (ORDER BY t2.invoice_number ASC) AS rn
FROM tableB t2
JOIN tableA t1
ON t2.part = t1.part
AND t1.recv_acct = t1.recv_acct) t
WHERE rn % 2 = 1
ORDER BY part, invoice_number;
结果:
+------+-----------+---------------+----------------+----------+-----------+
| PART | Recv_acct | customer_Name | invoice_number | Cost | Send_Acct |
+------+-----------+---------------+----------------+----------+-----------+
| QR1 | 6722 | ABC | 3310 | 10500,00 | 307131 |
| QR1 | 6722 | ABC | 3311 | 22400,00 | 22965 |
| QR1 | 6722 | ABC | 3312 | 2100,00 | 307131 |
| QR1 | 6722 | ABC | 3313 | 20300,00 | 22965 |
| QR1 | 6722 | ABC | 3314 | 3100,00 | 307131 |
| QR2 | 6700 | DEF | 2233 | 400,00 | 12345 |
| QR2 | 6700 | DEF | 2244 | 4000,00 | 54321 |
| QR2 | 6700 | DEF | 2333 | 500,00 | 54321 |
+------+-----------+---------------+----------------+----------+-----------+
+------+-----------+---------------+----------------+----------+-----------+
| PART | Recv_acct | customer_Name | invoice_number | Cost | Send_Acct |
+------+-----------+---------------+----------------+----------+-----------+
| QR1 | 6722 | ABC | 3310 | 10500,00 | 307131 |
| QR1 | 6722 | ABC | 3311 | 22400,00 | 22965 |
| QR1 | 6722 | ABC | 3312 | 2100,00 | 307131 |
| QR1 | 6722 | ABC | 3313 | 20300,00 | 22965 |
| QR1 | 6722 | ABC | 3314 | 3100,00 | 307131 |
| QR2 | 6700 | DEF | 2333 | 500,00 | 12345 |
| QR2 | 6700 | DEF | 2244 | 4000,00 | 12345 |
| QR2 | 6700 | DEF | 2233 | 400,00 | 54321 |
+------+-----------+---------------+----------------+----------+-----------+
要获得预期输出中提到的确切结果,您需要在单独的查询中对数据进行升序排序
QR1
和降序排序QR2
,然后按如下所示进行联合排序
SELECT
PART,
Recv_acct,
customer_Name,
invoice_number,
Cost,
Send_Acct
FROM (SELECT
t2.PART,
t2.Recv_acct,
t2.customer_Name,
t2.invoice_number,
t2.Cost,
t1.Send_Acct,
ROW_NUMBER() OVER (ORDER BY t2.invoice_number ASC) AS rn
FROM tableB t2
JOIN tableA t1
ON t2.part = t1.part
AND t1.recv_acct = t1.recv_acct
WHERE t2.part = 'QR1') t
WHERE rn % 2 = 1
UNION ALL
SELECT
PART,
Recv_acct,
customer_Name,
invoice_number,
Cost,
Send_Acct
FROM (SELECT
t2.PART,
t2.Recv_acct,
t2.customer_Name,
t2.invoice_number,
t2.Cost,
t1.Send_Acct,
ROW_NUMBER() OVER (ORDER BY t2.invoice_number DESC) AS rn
FROM tableB t2
JOIN tableA t1
ON t2.part = t1.part
AND t1.recv_acct = t1.recv_acct
WHERE t2.part = 'QR2') t
WHERE rn % 2 = 1
ORDER BY part, recv_acct;
结果:
+------+-----------+---------------+----------------+----------+-----------+
| PART | Recv_acct | customer_Name | invoice_number | Cost | Send_Acct |
+------+-----------+---------------+----------------+----------+-----------+
| QR1 | 6722 | ABC | 3310 | 10500,00 | 307131 |
| QR1 | 6722 | ABC | 3311 | 22400,00 | 22965 |
| QR1 | 6722 | ABC | 3312 | 2100,00 | 307131 |
| QR1 | 6722 | ABC | 3313 | 20300,00 | 22965 |
| QR1 | 6722 | ABC | 3314 | 3100,00 | 307131 |
| QR2 | 6700 | DEF | 2233 | 400,00 | 12345 |
| QR2 | 6700 | DEF | 2244 | 4000,00 | 54321 |
| QR2 | 6700 | DEF | 2333 | 500,00 | 54321 |
+------+-----------+---------------+----------------+----------+-----------+
+------+-----------+---------------+----------------+----------+-----------+
| PART | Recv_acct | customer_Name | invoice_number | Cost | Send_Acct |
+------+-----------+---------------+----------------+----------+-----------+
| QR1 | 6722 | ABC | 3310 | 10500,00 | 307131 |
| QR1 | 6722 | ABC | 3311 | 22400,00 | 22965 |
| QR1 | 6722 | ABC | 3312 | 2100,00 | 307131 |
| QR1 | 6722 | ABC | 3313 | 20300,00 | 22965 |
| QR1 | 6722 | ABC | 3314 | 3100,00 | 307131 |
| QR2 | 6700 | DEF | 2333 | 500,00 | 12345 |
| QR2 | 6700 | DEF | 2244 | 4000,00 | 12345 |
| QR2 | 6700 | DEF | 2233 | 400,00 | 54321 |
+------+-----------+---------------+----------------+----------+-----------+
我希望事情就这么简单。请检查最后输出所附的屏幕截图。不过,非常感谢您的快速解决方案:)您能否为您的查询提供一些逻辑,以便我们可以创建所需的answer@user3516970:请阅读:-)