Sql 选择不同条件下的每列值

Sql 选择不同条件下的每列值,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有一个SQL查询,如下所示: SELECT urban_appr, urban_in, rural_appr, rural_in, ground_appr, ground_in FROM <table> 选择城市进站、城市进站、农村进站、农村进站、地面进站、地面进站 从…起 在上面的查询中,我必须添加WHERE子句,如下所示: 对于城市值,其中方案类型='U' 对于农村值,其中scheme\u type='R' 对于基本值,其中scheme\u type='E' 我希望所

我有一个SQL查询,如下所示:

SELECT urban_appr, urban_in, rural_appr, rural_in, ground_appr, ground_in 
FROM <table>
选择城市进站、城市进站、农村进站、农村进站、地面进站、地面进站
从…起
在上面的查询中,我必须添加WHERE子句,如下所示:

  • 对于城市值,
    其中方案类型='U'
  • 对于农村值,
    其中scheme\u type='R'
  • 对于基本值,
    其中scheme\u type='E'
我希望所有这些都使用单个SQL查询。我正在使用SQLServer2005

编辑:

下面添加了实际问题的图片。您可以看到,它将district BR显示为两条记录,而我希望它显示在一行中


嗯,这看起来很难看-但是试试这个

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; 

嗯,这看起来很难看-但是试试这个

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; 

您是否正在尝试这样做-根据值的类型选择不同的列

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

这就是你要找的吗???

你是想做这样的事情吗?根据你的值的类型选择不同的列

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

这就是您要查找的内容吗???

使用
JOIN
将每个
地区的所有行合并为一行:

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';

使用
JOIN
将每个
district\u 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';

不,它工作不正常。它显示所有类别中的一组公用行。不,它工作不正常。它显示了所有类别中的一组通用行。好的,我需要再添加一列(district_nm),这将是第一列,我想在此列上分组。是的,它可以工作,但问题是,如果任何地区在所有类别(即U、R和e)中都有REOCRD,则不在一行中显示该地区的记录,它显示为三行。@RPK:您需要向我们展示一些示例数据,并更详细地解释您真正想要的是什么……好的,我需要再添加一列(district_nm),这将是第一列,我想在此列上分组。是的,它可以工作,但问题是,如果任何district在所有类别中都有REOCRD,即U、R和e,然后,它将显示三行,而不是一行显示该地区的记录。@RPK:您需要向我们显示一些示例数据,并更详细地解释您真正想要的是什么……您好,重复组先生。阅读并将您的表格拆分为two@Bohemian这是不可能的。我必须查询其他人设计的现有数据库。
scheme\u type
对于该
district\u nm='BR'
行的值是多少??原始数据中有两行吗??一个用于
district\u nm='BR'和scheme\u type='R'
,另一个用于
district\u nm='BR'和scheme\u type='E'
,或者这是如何工作的?不,我有一行。前两列是“U”,后两列是“R”,后两列是“E”。您好,重复组。阅读并将您的表格拆分为two@Bohemian这是不可能的。我必须查询其他人设计的现有数据库。
scheme\u type
对于该
district\u nm='BR'
行的值是多少??原始数据中有两行吗??一个用于
district\u nm='BR'和scheme\u type='R'
,另一个用于
district\u nm='BR'和scheme\u type='E'
,或者这是如何工作的?不,我有一行。前两列为“U”,后两列为“R”,后两列为“E”。