Вот проблема, с которой я сталкиваюсь в SQL Server, у меня есть таблица со следующими строками:
ID | Parameter | Value
123 | A | 0
123 | B | 1.27
123 | C | 2.13
124 | A | 1.29
...
И хотите вернуть эту уникальную строку для каждого идентификатора:
ID | A_Value | C_Value | BothA&C=0?
123| 0 | 2.13 | NO
Как я мог это сделать?





Вы можете использовать технику, известную как ПЕРЕКРЕСТНЫЕ ТАБЛИЦЫ.
SELECT ID,
MAX(CASE WHEN Parameter = 'A' THEN Value END) AS A_Value,
MAX(CASE WHEN Parameter = 'C' THEN Value END) AS C_Value,
CASE WHEN MAX(CASE WHEN Parameter = 'A' THEN Value END) = 0
AND MAX(CASE WHEN Parameter = 'A' THEN Value END) = 0 THEN 'Yes'
ELSE 'No' END AS [BothA&C=0?]
FROM YourTable
GROUP BY ID;
Вот два варианта — мне кажется, что вариант 1 написать проще, чем вариант 2, но какой из них имеет для вас больше смысла. Вы можете проверить это здесь (я добавил еще несколько идентификаторов и связанных записей параметров и значений для примера)
SELECT
ID
, [A_Value] = MAX(CASE WHEN Parameter = 'A' THEN Value END)
, [C_Value] = MAX(CASE WHEN Parameter = 'C' THEN Value END)
,[BothA&C=0] = (CASE WHEN max(CASE WHEN Parameter = 'A' THEN CAST(Value AS INT) END) = 0 AND max(CASE WHEN Parameter = 'C' THEN CAST(Value AS INT) END) = 0 THEN 'YES' ELSE 'NO' END )
FROM dbo.yourDataTable
GROUP BY ID
SELECT
ID
, [A_Value] = [A]
, [C_Value] = [C]
, [BothA&C=0] = CASE WHEN CAST([A] AS INT) = 0 AND CAST([C] AS INT) = 0 THEN 'YES' ELSE 'NO' END
FROM
(
SELECT
ID
,Parameter
,Value
FROM yourDataTable
) sourceTable
PIVOT
(
MAX(Value) FOR Parameter IN ([A],[C])
) AS pvt
Похоже, Луис залез туда с ответом, пока я печатал.
Сводное решение сработало для меня! Я не пробовал кросс-таблицу. Какой из них будет наиболее эффективным? Спасибо за помощь!
Ответ на который наиболее эффективен: это зависит. В этот вопрос есть хорошее обсуждение. Подобно примеру в ответе в этом потоке, когда я просматривал свойства плана выполнения для приведенного мной сводного примера, я мог видеть, что SQL создал операторы CASE за кулисами. В этом случае оба метода должны быть о равный.
Вероятно, наиболее распространенным способом сделать это будет использование агрегатов с регистром. Найдите ключевые слова "pivot sql server"...