SQL 求助,按投标分税
SQL Help, Splitting Tax by Tenders
我有一个销售点系统,其中所有支票和投标详细信息都在一个 table 中。我正在尝试编写一个 SQL 查询,以便我可以查看投标的支票总数,以与现金流量和银行对账单相协调。不幸的是,架构不是我的,无法更改。
我 运行 遇到的一个问题是,在某些情况下,一张支票有多个 t运行 行动涉及各种招标,因此我需要实施(业务集)规则以平均分配税收.这些规则将来可能会改变,如果有的话,首先将税收分配给 CC,所以我需要建立一些灵活性。
SQL table 看起来像这样:
CheckID
LineType
TenderName
LineTotal
Tax
1
ItemSold
5.00
0.25
1
TenderTotal
Cash
5.25
2
ItemSold
10.00
0.50
2
TenderTotal
Cash
5.00
2
TenderTotal
VISA
5.50
3
ItemSold
10.00
0.25
3
ItemSold
10.00
0.25
3
TenderTotal
AMEX
10.25
3
TenderTotal
VISA
10.25
4
ItemSold
10.00
0.50
4
TenderTotal
Cash
20.00
4
TenderTotal
Cash
-9.50
生成的报告需要每个投标有一行,税收在支票投标中平均分配,净收入是总销售额和税收之间的差额。
TenderName
TotalSale
NetRevenue
TaxCollected
Cash
20.75
19.75
1.00
VISA
15.75
15.25
0.50
AMEX
10.25
10.00
0.25
我尝试将 Select 与 Exists 一起使用,还有 CTE 和递归 CTE,但不太清楚如何干净地完成税收部分。我可以尝试其他 SQL 技巧吗?
我们目前正在使用 SQL Server 2012,但计划在不久的将来升级到 2016。
我不知道逻辑是否正确,但它会让你得到你想要的结果:
WITH Tenders AS(
SELECT V.CheckID,
V.LineType,
V.TenderName,
V.LineTotal,
SUM(CASE WHEN V.TenderName IS NULL THEN V.Tax END) OVER (PARTITION BY V.CheckID) AS Tax
FROM (VALUES(1,'ItemSold',NULL,5.00,0.25),
(1,'TenderTotal','Cash',5.25,NULL),
(2,'ItemSold',NULL,10.00,0.50),
(2,'TenderTotal','Cash',5.00,NULL),
(2,'TenderTotal','VISA',5.50,NULL),
(3,'ItemSold',NULL,10.00,0.25),
(3,'ItemSold',NULL,10.00,0.25),
(3,'TenderTotal','AMEX',10.25,NULL),
(3,'TenderTotal','VISA',10.25,NULL),
(4,'ItemSold',NULL,10.00,0.50),
(4,'TenderTotal','Cash',20.00,NULL),
(4,'TenderTotal','Cash',-9.50,NULL))V(CheckID,LineType,TenderName,LineTotal,Tax))
SELECT T.TenderName,
SUM(T.LineTotal) AS TotalSale,
SUM(T.LineTotal - T.Tax) AS NetRevenue,
SUM(T.Tax) AS TaxCollected
FROM Tenders T
WHERE T.TenderName IS NOT NULL
GROUP BY T.TenderName;
我有一个销售点系统,其中所有支票和投标详细信息都在一个 table 中。我正在尝试编写一个 SQL 查询,以便我可以查看投标的支票总数,以与现金流量和银行对账单相协调。不幸的是,架构不是我的,无法更改。
我 运行 遇到的一个问题是,在某些情况下,一张支票有多个 t运行 行动涉及各种招标,因此我需要实施(业务集)规则以平均分配税收.这些规则将来可能会改变,如果有的话,首先将税收分配给 CC,所以我需要建立一些灵活性。
SQL table 看起来像这样:
CheckID | LineType | TenderName | LineTotal | Tax |
---|---|---|---|---|
1 | ItemSold | 5.00 | 0.25 | |
1 | TenderTotal | Cash | 5.25 | |
2 | ItemSold | 10.00 | 0.50 | |
2 | TenderTotal | Cash | 5.00 | |
2 | TenderTotal | VISA | 5.50 | |
3 | ItemSold | 10.00 | 0.25 | |
3 | ItemSold | 10.00 | 0.25 | |
3 | TenderTotal | AMEX | 10.25 | |
3 | TenderTotal | VISA | 10.25 | |
4 | ItemSold | 10.00 | 0.50 | |
4 | TenderTotal | Cash | 20.00 | |
4 | TenderTotal | Cash | -9.50 |
生成的报告需要每个投标有一行,税收在支票投标中平均分配,净收入是总销售额和税收之间的差额。
TenderName | TotalSale | NetRevenue | TaxCollected |
---|---|---|---|
Cash | 20.75 | 19.75 | 1.00 |
VISA | 15.75 | 15.25 | 0.50 |
AMEX | 10.25 | 10.00 | 0.25 |
我尝试将 Select 与 Exists 一起使用,还有 CTE 和递归 CTE,但不太清楚如何干净地完成税收部分。我可以尝试其他 SQL 技巧吗?
我们目前正在使用 SQL Server 2012,但计划在不久的将来升级到 2016。
我不知道逻辑是否正确,但它会让你得到你想要的结果:
WITH Tenders AS(
SELECT V.CheckID,
V.LineType,
V.TenderName,
V.LineTotal,
SUM(CASE WHEN V.TenderName IS NULL THEN V.Tax END) OVER (PARTITION BY V.CheckID) AS Tax
FROM (VALUES(1,'ItemSold',NULL,5.00,0.25),
(1,'TenderTotal','Cash',5.25,NULL),
(2,'ItemSold',NULL,10.00,0.50),
(2,'TenderTotal','Cash',5.00,NULL),
(2,'TenderTotal','VISA',5.50,NULL),
(3,'ItemSold',NULL,10.00,0.25),
(3,'ItemSold',NULL,10.00,0.25),
(3,'TenderTotal','AMEX',10.25,NULL),
(3,'TenderTotal','VISA',10.25,NULL),
(4,'ItemSold',NULL,10.00,0.50),
(4,'TenderTotal','Cash',20.00,NULL),
(4,'TenderTotal','Cash',-9.50,NULL))V(CheckID,LineType,TenderName,LineTotal,Tax))
SELECT T.TenderName,
SUM(T.LineTotal) AS TotalSale,
SUM(T.LineTotal - T.Tax) AS NetRevenue,
SUM(T.Tax) AS TaxCollected
FROM Tenders T
WHERE T.TenderName IS NOT NULL
GROUP BY T.TenderName;