Выберите значение каждого столбца по различным критериям - PullRequest
1 голос
/ 05 ноября 2011

У меня есть SQL-запрос, как показано ниже:

SELECT urban_appr, urban_in, rural_appr, rural_in, ground_appr, ground_in 
FROM <table>

В приведенном выше запросе я должен добавить предложение WHERE следующим образом:

  • Для городских значений WHERE scheme_type = 'U'
  • Для сельских значений: WHERE scheme_type = 'R'
  • Для базовых значений: WHERE scheme_type = 'E'

Я хочу все это с помощью одного SQL-запроса.Я использую SQL Server 2005.

Отредактировано:

Добавлено изображение ниже реальной проблемы.Вы можете видеть, что это показывает район BR как две записи, тогда как я хочу это в одной строке.

enter image description here

Ответы [ 3 ]

2 голосов
/ 06 ноября 2011

Используйте JOIN, чтобы объединить все строки для каждого district_nm в одну строку:

select
    district_nm,
    t1.urban_appr, t1.urban_in,
    t2.rural_appr, t2.rural_in,
    t3.ground_appr, t3.ground_in
from <table> t1
join <table> t2 on t2.district_nm = t1.district_nm and t2.scheme_type = 'R'
join <table> t3 on t3.district_nm = t1.district_nm and t3.scheme_type = 'E'
where t1.scheme_type = 'U';

Вы можете добавить дополнительные условия к предложению where, например and t1.district_nm = 'x'

Рассмотрите возможность создания представления из вышеприведенного запроса и используйте его в нашем приложении:

create view table_view as
<above query>
1 голос
/ 05 ноября 2011

Вы пытаетесь сделать что-то вроде этого - выбираете разные столбцы в зависимости от типа ваших значений ??

SELECT urban_appr, urban_in, NULL, NULL, NULL, NULL
FROM dbo.YourTable WHERE scheme_type = 'U'
UNION
SELECT NULL, NULL, rural_appr, rural_in, NULL, NULL
FROM dbo.YourTable WHERE scheme_type = 'R'
UNION
SELECT NULL, NULL, NULL, NULL, ground_appr, ground_in
FROM dbo.YourTable WHERE scheme_type = 'E'

???

Обновление: , поэтому вы хотите добавить еще один столбец и группу по нему:

SELECT district_nm, urban_appr, urban_in, NULL, NULL, NULL, NULL
FROM dbo.YourTable WHERE scheme_type = 'U'
UNION
SELECT district_nm, NULL, NULL, rural_appr, rural_in, NULL, NULL
FROM dbo.YourTable WHERE scheme_type = 'R'
UNION
SELECT district_nm, NULL, NULL, NULL, NULL, ground_appr, ground_in
FROM dbo.YourTable WHERE scheme_type = 'E'
GROUP BY district_nm

Это то, что вы ищете ??

1 голос
/ 05 ноября 2011

Ну, это выглядит ужасно - но попробуйте это ...

SELECT ISNULL(district_nm,nm) district_nm,
  URBAN_APPR,
  URBAN_IN,
  RURAL_APPR,
  RURAL_IN,
  ground_appr,
  ground_in
FROM
  (SELECT ISNULL(a.district_nm, b.district_nm) nm,
    urban_appr,
    urban_in,
    rural_appr,
    rural_in
  FROM
    (SELECT DISTRICT_NM,
      URBAN_APPR,
      URBAN_IN
    FROM TABLE_NAME
    WHERE SCHEME_TYPE = 'U'
    ) a
  FULL OUTER JOIN (
    (SELECT DISTRICT_NM,
      RURAL_APPR,
      RURAL_IN
    FROM TABLE_NAME
    WHERE SCHEME_TYPE = 'R'
    )B)
  ON a.district_nm = b.district_nm
  ) temp
FULL OUTER JOIN (
  (SELECT DISTRICT_NM,
    GROUND_APPR,
    GROUND_IN
  FROM TABLE_NAME
  WHERE SCHEME_TYPE = 'E'
  )c)
ON temp.nm = c.district_nm; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...