вычитать операцию над двумя строками временной таблицы на сервере SQL - PullRequest
0 голосов
/ 02 августа 2011
Age16_20    AgeBelow_16 Age21_30    Age31_40    Age41_50    Age51_60 QID

 93         81          55          46          54          48        1

 13         11          15          16          14          18        2

Я хочу вычесть второй ряд из первого?что является лучшим способом сделать внутри хранимой процедуры.здесь проблема производительности, поэтому, пожалуйста, предоставьте оптимальное решение.

Ответы [ 3 ]

2 голосов
/ 02 августа 2011

Предполагается только 2 строки.

SELECT
    SUM(CASE WHEN ID = 2 THEN -Age16_20 ELSE Age16_20 END),
    SUM(CASE WHEN ID = 2 THEN -AgeBelow_16 ELSE AgeBelow_16 END),
    SUM(CASE WHEN ID = 2 THEN -Age21_30 ELSE Age21_30 END),
   ...etc
FROM
   Mytable

Если более 2 строк (почему?), Тогда измените CASE на

CASE ID WHEN 1 THEN Age16_20 WHEN 2 THEN -Age16_20 ELSE NULL END
2 голосов
/ 02 августа 2011
SELECT
  [qid1].AgeBelow16 - [qid2].AgeBelow16       AS [AgeBelow16],
  [qid1].Age16_20   - [qid2].Age16_20         AS [Age16_20],
  [qid1].Age21_30   - [qid2].Age21_30         AS [Age21_30],
  [qid1].Age31_40   - [qid2].Age31_40         AS [Age31_40],
  [qid1].Age41_50   - [qid2].Age41_50         AS [Age41_50],
  [qid1].Age51_60   - [qid2].Age51_60         AS [Age51_60]
FROM
  MyTable AS [qid1]
INNER JOIN
  MyTable AS [qid2]
    ON [qid1].QID = [qid2].QID - 1
WHERE
  [qid1].QID = 1

Однако, если это возможно, вам лучше хранить значения QID2 как отрицательные значения. Таким образом, вам не нужно знать, какой из них вычитать из другого; это просто СУММА.

SELECT
  SUM(AgeBelow16) AS [AgeBelow16],   -- (93) + (-13) = 80
  SUM(Age16_20)   AS [Age16_20],     -- (81) + (-11) = 70
  SUM(Age21_30)   AS [Age21_30],     -- (55) + (-15) = 40
  SUM(Age31_40)   AS [Age31_40],     -- (46) + (-16) = 30
  SUM(Age41_50)   AS [Age41_50],     -- (54) + (-14) = 40
  SUM(Age51_60)   AS [Age51_60]      -- (48) + (-18) = 30
FROM
  MyTable
2 голосов
/ 02 августа 2011

Предполагая, что у вас есть уникальный идентификатор в строках (мы предполагаем, что это ID), вы могли бы сделать что-то вроде (для краткости я сделал только первый столбец):

SELECT SUM(Age16_20) FROM
(SELECT Age16_20
 FROM table
 WHERE ID = 1
 UNION ALL
 SELECT -Age16_20
 FROM table
 WHERE ID = 2) Temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...