Intereting Posts
Оптимизировать предложение даты МЕЖДУ получить следующее значение последовательности из базы данных, используя спящий режим Индивидуальный пейджинг с повторителем и SQL Перекрестное соединение «n» за столом Инструкция содержит предложение OUTPUT без предложения предложения INTO Выровнять строки Url в иерархии деревьев Как распространять среднее значение между двумя интервалами в оракуле Разница в производительности между глобальным подключением к базе данных и открытием соединения каждый раз на Golang Возвращение нескольких наборов записей из сохраненного proc в C # Операция интеллектуального анализа данных с использованием SQL Query (Fuzzy Apriori Algorithm) – Как я могу ее кодировать с помощью SQL? SQL – округление до 2 знаков после запятой Попытка понять () и разделить на Запрос проверки индекса на таблицу Как скопировать базу данных SQL Server с одного сервера на другой без каких-либо резервных копий Как найти ближайший (день недели) на определенную дату

Сумма конкретных значений в SQL

Я пытаюсь найти сумму конкретных значений в таблице, используя SQL. Примерная таблица:

+-------+-------+-------+-------+-------+-------+-------+ | ID | Co1 | Va1 | Co2 | Va2 | Co3 | Va3 | +-------+-------+-------+-------+-------+-------+-------+ | 01 | AA1 | 23.0| AA2 | 11.2| AA3 | 328.34| | 02 | AA2 | 27.0| AA3 | 234.56| AA4 | 23.8| | 03 | AA1 | 409.01| AA4 | 234.98| NULL | NULL | +-------+-------+-------+-------+-------+-------+-------+ 

У меня есть 35 таких столбцов и значений кода.

Мне нужно выбрать таблицу, содержащую только один код. Скажем, мне нужен код AA3, это будет (колонка «Код» здесь не требуется, но только для того, чтобы показать, где я получил значения):

 +-------+-------+--------+ | ID | Code | Value | +-------+-------+--------+ | 01 | AA3 | 328.34| | 02 | AA3 | 234.56| | 03 | AA3 | 0| +-------+-------+--------+ 

И позже мне понадобится другой (отдельный) запрос, который содержит сумму нескольких кодов, например сумму кодов AA1 и AA2 вместе.

 +-------+---------+ | ID | Value | +-------+---------+ | 01 | 34.2| | 02 | 27.0| | 03 | 409.01| +-------+---------+ 

Я думал о наличии «ГДЕ» и работал на каждых 35 столбцах, но это было бы очень утомительно, и это не кажется слишком эффективным. Мне было интересно, есть ли способ сделать это через SQL (я могу сделать это с помощью Excel с инструкцией if, и это творит чудеса).

Может быть, если бы был способ поиска по строке, верните имя столбца и затем используйте это имя столбца для извлечения номера?

Дайте мне знать, если вам нужна дополнительная информация =)

Вам следует сохранить ваши данные в нормализованной форме .

Однако…

 select SUM(v) from ( select * -- ID, r, v from (select * from yourtable) u unpivot ( r for co in (co1, co2, co3)) as u1 unpivot ( v for va in (va1, va2, va3)) as u2 where RIGHT(co,1) = RIGHT(va,1) ) v WHERE R = 'AA1' -- etc 

вернет результаты, которые вы ищете

Ваша структура таблицы менее идеальна. Я покажу вам простой пример, подобный методу IF основе Excel, а затем гораздо более простой запрос с нормализованной структурой данных.

 SELECT id, CASE WHEN co1 = 'AA1' THEN co1 ELSE 0 END + CASE WHEN co2 = 'AA1' THEN co2 ELSE 0 END + CASE WHEN co3 = 'AA1' THEN co3 ELSE 0 END + CASE WHEN co4 = 'AA1' THEN co4 ELSE 0 END + etc, etc FROM yourTable 

С 30 кодами на id вам нужно 30 операторов CASE .

Альтернативой является наличие нескольких строк данных для каждого id , а не нескольких столбцов на один id .

 +-------+-------+-------+-------+ | ID | Obs | Cod | Val | +-------+-------+-------+-------+ | 01 | 1 | AA1 | 23.0 | | 01 | 2 | AA2 | 11.2 | | 01 | 3 | AA3 | 328.34| | 02 | 1 | AA2 | 27.0| | 02 | 2 | AA3 | 234.56| | 02 | 3 | AA4 | 23.8| | 03 | 1 | AA1 | 409.01| | 03 | 2 | AA4 | 234.98| +-------+-------+-------+-------+ 

Запрос прост, вы можете добавить столько наблюдений, сколько хотите, без изменения структуры таблицы и целого ряда других преимуществ …

  Query if one id can have several Query if one id can only have one observations for the same code: observation for any one code: ---------------------------------- ----------------------------------- SELECT SELECT id, * cod, FROM SUM(val) AS val yourTable FROM WHERE yourTable cod = 'AA1' WHERE cod = 'AA1' GROUP BY id, cod