【发布时间】:2020-08-31 09:15:56
【问题描述】:
我有两张桌子:#temptable_1 和 #temptable_2。我需要选择在另一个表中没有可以减去的行的行。让我澄清一下:
-
列“代码”和“代码 1”的行的“价格”值为“-2000”。列“代码 4”的行有一个值为“2000”的“价格”。 这意味着如果我们对这些列求和,那么 Sum 将为零。所以这两行 不应该被选中。
-
列“代码”和“代码 2”的行的“金额”值为“-10780.56”。列“代码 5”的行有一个“金额”,其值为“10780.56”。 这意味着如果我们对这些列求和,那么 Sum 将为零。所以这两行 不应该被选中。
-
列“代码”和“代码 3”的行有一个值为“-12936.67”的“AmountIncVAT”。列“代码 6”的行有一个“AmountIncVAT”,其值为“12936.67”。这意味着如果我们对这些列求和,那么 Sum 将为零。所以这两行 不应该被选中。
-
列“代码”和“代码7”的行应该在选择结果中,因为它不能与
temptable_1的其他列相加
因此,可以求和的列是:Price、VAT、Amount、AmountIncVAT
表格如下所示:
DROP TABLE IF EXISTS #temptable_1
CREATE TABLE #temptable_1 ( [Name] varchar(10), [Code] varchar(50), [id_Car] int, [PositionName] varchar(1000),
[Count] decimal(18,3), [id_Unit] int, [Price] decimal(15,2), [VAT] decimal(15,2),
[Amount] decimal(15,2), [AmountIncVAT] decimal(15,2))
INSERT INTO #temptable_1
VALUES
( '1', 'Code 1', 632324, 'Position 1', 1.000, 1036, -2000.00, -401.00, 2001.00, 2401.00),
( '2', 'Code 2', 632324, 'Position 2', 1.000, 1036, -10780.56, -2156.11, -10780.56, 10.67),
( '3', 'Code 3', 632324, 'Position 3', 1.000, 1036, -18780.56, -1, 558.56, -12936.67)
DROP TABLE IF EXISTS #temptable_2
CREATE TABLE #temptable_2 ( [Name] varchar(10), [Code] varchar(50), [id_Car] int, [PositionName] varchar(1000),
[Count] decimal(18,3), [id_Unit] int, [Price] decimal(15,2), [VAT] decimal(15,2),
[Amount] decimal(15,2), [AmountIncVAT] decimal(15,2))
INSERT INTO #temptable_2
VALUES
( '4', 'Code 4', 632324, 'Position 4', 1.000, 1036, 2000.00, 402.00, 3001.00, 8101.00),
( '5', 'Code 5', 632324, 'Position 5', 1.000, 1036, 11780.56, 2156.11, 10780.56, 18936.67),
( '6', 'Code 6', 632324, 'Position 6', 1.000, 1036, 10580.56, 3, -21780.56, 12936.67),
( '7', 'Code 7', 632324, 'Position 7', 8.000, NULL, 415.34, 664.54, 3322.72, 3987.26)
想要的结果是一行带有“代码 7”:
7 Code 6 632324 Position 6 8.000 NULL 415.34 664.54 3322.72 3987.26
我写了以下代码:
SELECT
*
FROM
(
SELECT
COUNT(1) OVER (PARTITION BY ABS(q.Price) ORDER BY ABS(q.Price)) as CountByPrice
, COUNT(1) OVER (PARTITION BY ABS(q.Vat) ORDER BY ABS(q.Vat)) as CountByVat
, COUNT(1) OVER (PARTITION BY ABS(q.Amount) ORDER BY ABS(q.Amount)) as CountByAmount
, COUNT(1) OVER (PARTITION BY ABS(q.AmountIncVAT) ORDER BY ABS(q.AmountIncVAT)) as CountByAmountIncVat
, q.*
FROM
(
SELECT * FROM #temptable_1
UNION ALL
SELECT * FROM #temptable_2
) AS q
) AS q1
WHERE q1.CountByPrice =1 AND q1.CountByVat =1 AND q1.CountByAmount = 1 AND q1.CountByAmountIncVat = 1
这段代码可以写得更短吗?
【问题讨论】:
-
当多行具有相同的列值时会发生什么,例如
price具有不同的符号? -
@GordonLinoff 感谢您的提问。只有两行可以有不同符号的值
标签: sql sql-server tsql