Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询按科目数分配成本_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 查询按科目数分配成本

Sql 查询按科目数分配成本,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]

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]

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:请阅读:-)