【问题标题】:Select rows which does not have sum equals to zero选择总和不为零的行
【发布时间】:2020-08-31 09:15:56
【问题描述】:

我有两张桌子:#temptable_1 和 #temptable_2。我需要选择在另一个表中没有可以减去的行的行。让我澄清一下:

  1. 列“代码”和“代码 1”的行的“价格”值为“-2000”。列“代码 4”的行有一个值为“2000”的“价格”。 这意味着如果我们对这些列求和,那么 Sum 将为零。所以这两行 不应该被选中。

  2. 列“代码”和“代码 2”的行的“金额”值为“-10780.56”。列“代码 5”的行有一个“金额”,其值为“10780.56”。 这意味着如果我们对这些列求和,那么 Sum 将为零。所以这两行 不应该被选中。

  3. 列“代码”和“代码 3”的行有一个值为“-12936.67”的“AmountIncVAT”。列“代码 6”的行有一个“AmountIncVAT”,其值为“12936.67”。这意味着如果我们对这些列求和,那么 Sum 将为零。所以这两行 不应该被选中。

  4. 列“代码”和“代码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


【解决方案1】:
WITH
-- your input
temptable_1(Name,Code,id_Car,PositionName,Count,id_Unit,Price,VAT,Amount,AmountIncVAT)
AS (
          SELECT '1', 'Code 1', 632324, 'Position 1', 1.000, 1036, -2000.00, -401.00, 2001.00, 2401.00
UNION ALL SELECT '2', 'Code 2', 632324, 'Position 2', 1.000, 1036, -10780.56, -2156.11, -10780.56, 10.67
UNION ALL SELECT '3', 'Code 3', 632324, 'Position 3', 1.000, 1036, -18780.56, -1, 558.56, -12936.67
)
,
temptable_2 ( Name , Code , id_Car , PositionName , Count , id_Unit , Price , VAT , Amount , AmountIncVAT)
AS (
          SELECT'4', 'Code 4', 632324, 'Position 4', 1.000, 1036, 2000.00, 402.00, 3001.00, 8101.00
UNION ALL SELECT'5', 'Code 5', 632324, 'Position 5', 1.000, 1036, 11780.56, 2156.11, 10780.56, 18936.67
UNION ALL SELECT'6', 'Code 6', 632324, 'Position 6', 1.000, 1036, 10580.56, 3, -21780.56, 12936.67
UNION ALL SELECT'7', 'Code 7', 632324, 'Position 7', 8.000, NULL, 415.34, 664.54, 3322.72, 3987.26
)
-- your input ends here. Real query starts here, replace comma with WITH
,
botht AS (
  SELECT * FROM temptable_1
  UNION ALL
  SELECT * FROM temptable_2
)
SELECT
  *
FROM botht b
WHERE NOT EXISTS(
  SELECT 1 FROM botht c WHERE b.price = c.price * -1
)
  AND NOT EXISTS(
  SELECT 1 FROM botht c WHERE b.amount = c.amount * -1
)
  AND NOT EXISTS(
  SELECT 1 FROM botht c WHERE b.amountIncVAT = c.amountIncVAT * -1
)
;
-- out  Name |  Code  | id_Car | PositionName | Count | id_Unit | Price  |  VAT   | Amount  | AmountIncVAT 
-- out ------+--------+--------+--------------+-------+---------+--------+--------+---------+--------------
-- out  7    | Code 7 | 632324 | Position 7   | 8.000 |         | 415.34 | 664.54 | 3322.72 |      3987.26

【讨论】:

  • 谢谢!这真的是很好的解决方案!太棒了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多