SQL Как выбрать столбец по значению столбца - PullRequest
0 голосов
/ 05 декабря 2018

Я бы хотел иметь возможность выбрать столбец в соответствии со значением в другом столбце.На простом примере: из

Name  Status       Activities
A     Full         Tennis
B     Discounted   Badminton
C     Full         Badminton

и

Sport      Full   Discounted
Tennis      70    60
Badminton   110   90

я хотел бы вывести:

 Name  Due         
 A     70     
 B     90
 C     110

Чтобы объединить первые две таблицы, выделите только необходимостьвыбрать один столбец из значения в другом.Мой выбор для хранения данных может быть плохим.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

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

Поскольку комбинация статуса и вида спорта дает норму, данные не нормализуются, поскольку у вас есть два столбца ставок.

SELECT Name, Due
FROM A
INNER JOIN (SELECT Sport, 'Full' as Status, Full as Due FROM B UNION ALL
            SELECT Sport, 'Discounted' as Status, Discounted as Due FROM B) B
 on A.Activities = B.Sport
and A.Status = B.Status

Вместо таблицы, подобной этой:

Sport      Full   Discounted
Tennis      70    60
Badminton   110   90

Это нормализовано, поскольку вы можете добавлять виды спорта / ставки и новые ставки без изменения структуры.Если вам нужно было добавить новый тип тарифа в предыдущем формате, вы бы добавили таблицу.

Sport      RateType      Rate
Tennis     Full          70
Tennis     Discounted    60
Badminton  Full          110
Badminton  Discounted    90

Таким образом, вы можете добавлять спортивные ставки и различные тарифы без изменения кода.

Tennis     Weekend    20
Complete   Family     575

Технически у вас должна быть таблица RateType, в которой будут перечислены имя тарифа и идентификатор, чтобычто у вас может быть полный список всех доступных типов тарифов, которые затем могут быть привязаны к каждому виду спорта и $ курса по мере необходимости.Вы также можете показать, когда типы ставок были амортизированы, поэтому они не могут быть выбраны новыми, но позволяют существующим сохраняться.

0 голосов
/ 05 декабря 2018

Ваш выбор хранилища данных в порядке, хотя, возможно, было бы лучше иметь значения id в каждой таблице и связывать таблицу сотрудников с таблицей сборов по значению сборов id, а не с именем.Учитывая вашу структуру в том виде, в каком она есть, вы можете получить нужные результаты с помощью простого JOIN:

SELECT p.Name
     , CASE WHEN p.Status = 'Full' THEN d.Full ELSE d.Discounted END AS Due
FROM people p
JOIN dues d ON d.Sport = p.Activities

Вывод:

Name    Due
A       70
B       90
C       110

Демонстрация по SQLFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...