Ответ 1
Это то, что вы пытаетесь сделать?
Declare @var int, @id int
SET @var = 0
SELECT @id = id FROM Table t
if(@id = @var)
BEGIN
SET @var = @var + 1
END
ELSE
BEGIN
SET @var = @var - 1
END
print @var
Как я могу установить в переменных выбора MS Sql, идея выглядит так:
Declare @var int
SET @var = 0;
Select (if(idid = @var) then sum+1 else sum-1) AS Sum,
set @var = id
FROM table
Изменить на основе комментариев.
DECLARE @T TABLE
(
ID INT PRIMARY KEY,
IDID INT,
SUMM INT
)
INSERT INTO @T
SELECT 1,1,4 UNION ALL
SELECT 2,1,5 UNION ALL
SELECT 3,2,6 UNION ALL
SELECT 4,2,7 UNION ALL
SELECT 5,3,8
В результате выбора мне нужно:
ID IDID SUMM
-- ---- ----
1 1 4
2 1 0
3 2 6
4 2 0
5 3 8
Это то, что вы пытаетесь сделать?
Declare @var int, @id int
SET @var = 0
SELECT @id = id FROM Table t
if(@id = @var)
BEGIN
SET @var = @var + 1
END
ELSE
BEGIN
SET @var = @var - 1
END
print @var
Просто используйте SELECT.
например.
SELECT @myValue = MyField FROM MyTable WHERE ....
Хотя, как и другие, я действительно не понимаю, запрос ниже производит вывод, как указано в исходном сообщении (которое, в свою очередь, было получено из вашего комментария). Для этого требуется SQL Server 2005 или выше.
WITH cte AS (
SELECT
ID,
IDID,
SUMM,
RowNum = ROW_NUMBER() OVER (PARTITION BY IDID ORDER BY ID)
FROM @T
)
SELECT
ID,
IDID,
SUMM = CASE RowNum WHEN 1 THEN SUMM ELSE 0 END
FROM cte
В принципе, столбец вывода SUMM
содержит SUMM
из исходной таблицы, если это первое вхождение IDID
, как указано в ID
, иначе столбец содержит 0
.
Не уверен, насколько это далеко от того, что вам нужно, но, возможно, это поможет вам более точно объяснить вашу проблему.
У меня была плохая привычка нарушать ссылочную целостность при использовании моих тестовых данных. Но это было полезно для восстановления данных со ссылочной целостностью после того, как я закончил тестирование своих сценариев:
DECLARE @foreign_id INTEGER;
SET @foreign_id = (SELECT TOP 1 (FK_column) FROM (FK_table));
-- To confirm the value is what you want it to be
SELECT @foreign_id;
Теперь я могу вставлять данные обратно после завершения, используя это значение, чтобы:
-- Referential integrity check:
SELECT (FK_column) FROM (FK_table)
WHERE (FK_column) NOT IN
(SELECT (PK_column) FROM (PK_table));
не возвращает никаких значений.