Вопрос:

Расчет суммы (столбца) на основе других значений столбца в той же таблице

sql sql-server sql-server-2008-r2

646 просмотра

4 ответа

552 Репутация автора

У меня есть следующая таблица

Id   quantity    level_1     group_1
1    13          1           1
2    10          1           1
3    10          0           1
4    10          0           1
5    20          1           0

Я хочу пренебречь level_1 = '0' из таблицы выше.

Я хочу вычислить сумму (количество) для group_1 = '1' и group_1 = '0' отдельно, удовлетворяя первому условию выше.

Ожидаемый результат:

sum_quantity   sum_quantity_2_Not_Valid
23             20  
Автор: Arockia Nirmal Источник Размещён: 10.03.2017 12:31

Ответы (4)


1 плюс

3218 Репутация автора

Use SUB query to get result :

CREATE TABLE #Table(Id INT,  quantity INT, level_1 INT, group_1 INT)
INSERT INTO #Table(Id ,  quantity , level_1 , group_1)
SELECT 1,13,1,1 UNION ALL
SELECT 2,10,1,1 UNION ALL
SELECT 3,10,0,1 UNION ALL
SELECT 4,10,0,1 UNION ALL
SELECT 5,20,1,0

SELECT SUM(A.quantity) sum_quantity,SUM(B.quantity) sum_quantity_2_Not_Valid 
FROM 
(
   SELECT SUM(quantity) quantity,group_1
   FROM #Table
   WHERE level_1 = 1 AND group_1 = 1
   GROUP BY group_1
 )A,
 (
   SELECT SUM(quantity) quantity,group_1
   FROM #Table
   WHERE level_1 = 1 AND group_1 = 0
   GROUP BY group_1
  )B
Автор: Mansoor Размещён: 10.03.2017 12:45

1 плюс

4485 Репутация автора

Решение

Попробуйте как ниже

Схема:

CREATE TABLE #TAB (Id INT, quantity INT, level_1 INT, group_1 INT)
INSERT INTO #TAB

SELECT 1, 13, 1, 1
UNION ALL
SELECT 2, 10, 1, 1
UNION ALL
SELECT 3, 10, 0, 1
UNION ALL
SELECT 4, 10, 0, 1
UNION ALL
SELECT 5, 20, 1, 0

Использовать SUMсCASE

SELECT  SUM(CASE level_1 WHEN 1 THEN quantity ELSE 0 END) AS sum_quantity
, SUM(CASE level_1 WHEN 0 THEN quantity ELSE 0 END) AS sum_quantity_2_Not_Valid 
FROM #TAB
WHERE group_1 =1

И результат будет

+--------------+--------------------------+
| sum_quantity | sum_quantity_2_Not_Valid |
+--------------+--------------------------+
|           23 |                       20 |
+--------------+--------------------------+

Если ваше намерение получить значения путем группировки group_1

SELECT [1] AS sum_quantity, [0] AS sum_quantity_2_Not_Valid  FROM (
SELECT group_1,
SUM(CASE level_1 WHEN 1 THEN quantity ELSE 0 END) AS sum_quantity
FROM #TAB
GROUP BY group_1
)AS A
PIVOT
(
    MAX( sum_quantity) FOR group_1 IN ([1],[0])
)PVT
Автор: Shakeer Mirza Размещён: 10.03.2017 12:49

0 плюса

147 Репутация автора

Я уверен, что это сделало бы это: -

SELECT MAX(Valid_Sum) AS Final_Valid_Sum,
       MAX(Invalid_sum) AS Final_InValid_Sum
FROM
(
    SELECT SUM(quantity) Valid_Sum,
           0 AS Invalid_Sum
    FROM Table1
    WHERE level_1 <> 0
          AND group_1 = 1
    UNION
    SELECT 0,
           SUM(Quantity)
    FROM Table1
    WHERE level_1 <> 0
          AND group_1 = 0
);
Автор: Sid Размещён: 10.03.2017 12:49

0 плюса

468 Репутация автора

Это будет ответ, так как он хочет исключить level_1 = '0' :

SELECT SUM(CASE group_1 WHEN 1 THEN quantity ELSE 0 END) AS sum_quantity
     , SUM(CASE group_1 WHEN 0 THEN quantity ELSE 0 END) AS sum_quantity_2_Not_Valid 
FROM table
WHERE level_1 <> 0
Автор: VDK Размещён: 10.03.2017 01:44
Вопросы из категории :
32x32