Создать таблицу путем слияния строк на основе условий - PullRequest
0 голосов
/ 28 февраля 2019

Вот проблема, с которой я сталкиваюсь в 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

Как я мог это сделать?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вот два варианта - я склонен считать, что вариант 1 легче написать, чем вариант 2, но какой из них имеет для вас больший смысл.Вы можете проверить это здесь (я добавил еще несколько идентификаторов и связанных записей параметров и значений для примера)

1 Кросс-таблица

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

2Pivot

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
0 голосов
/ 28 февраля 2019

Вы можете использовать технику, известную как CROSS TABS.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...