我正在开发一个用户输入姓名,年龄,居住州的应用程序。我们希望捕获用于各种事物的状态。当只列出一个姓名,年龄,居住州时,非常直接。在某些情况下,用户可以列出多个姓名,年龄,居住州。所有数据都存储在一个名为Table的表中。有ID,名称和值列。我试图转动数据,然后选择我需要的居住州。我需要考虑两种情况。
- 在申请表上输入了多个姓名,年龄,居住州。我们想要的居住地是年龄最大的居住地。即
Name Age State of Residence
John 25 FL
Bill 31 AL
Sue 26 MS
在方案1中,我想将AL作为居住国返回
- 在申请表上输入了多个姓名,年龄,居住州。如果多个居住州的年龄相同,则按字母顺序返回首先出现的状态。
Name Age State of Residence
John 25 FL
Will 25 CA
Sue 26 MS
在方案2中,我想将CA作为居住国返回
我试过了:
Select State, Age
FROM (
Select * from Table
where ID = @ID and Name IN (State,Age)
) as s
PIVOT
(
MAX(value) FOR Name IN (State,Age)
) as pvt
这会返回数据,我只是缺乏如何完成其余部分的知识。我尝试添加分组但它不适用于PIVOT。
我也是这样试过的:
DECLARE @State AS NVARCHAR(2)
SELECT
[State],[ [Acres]
INTO #tmpTable FROM Table
PIVOT
(
MAX(Value)
FOR [Name]
IN ([State],[Acres])AS p
WHERE ID = @ID
--
SELECT * FROM #tmpTable
--
DROP TABLE #tmpTable
已编辑/更新的信息: 我有一个名为dbo的表。具有ID,NAME,VALUE,INSTANCE列的表。在第一个场景中,用户输入两个不同的记录后,表格如下所示:
ID NAME VALUE INSTANCE
1000 FIRST NAME JOHN 1
1000 AGE 25 1
1000 STATE AZ 1
1000 FIRST NAME BILL 2
1000 AGE 27 2
1000 STATE NH 2
我希望将NH作为居住国返回,因为它有着最高的年龄。
在第二种情况下,表格如下:
ID NAME VALUE INSTANCE
1000 FIRST NAME JOHN 1
1000 AGE 25 1
1000 STATE AZ 1
1000 FIRST NAME BILL 2
1000 AGE 25 2
1000 STATE NH 2
我想将AZ作为居住国返回,因为它首先按字母顺序排列
我考虑了这两种情况。两者都不保证会发生。用户只能输入一条记录。无论哪种方式,总是返回居住国。我希望这更有意义。我试图像你上面看到的那样转动数据,但是不明白如何获得我需要的状态。感谢。
答案 0 :(得分:0)
<强> 被修改 强>
确定。我明白了。你遇到了一个糟糕的设计表。它至少在1FN中,其中每个表列(属性)不能存储来自单个域的多个值。 在您的情况下,您有一个广泛的表,接受您想要的任何类型的属性。最好的选择是将列修复为常用的1FN表,例如:
CREATE TABLE dbo.table (
instance INTEGER ... ,
first_name VARCHAR... ,
age integer... ,
state CHAR(2)...
)
无论如何,如果您正在使用无法修改的旧应用程序,请尝试以下方法:
-- Create a database VIEW to simulate a 1FN table
CREATE VIEW dbo.view1 AS
SELECT DISTINCT
t.INSTANCE,
(
SELECT
t2.value
FROM
dbo.table t2
WHERE
t2.id = t.id
AND t2.instance = t.instance
AND t2.name = 'FIRST NAME'
) AS FIRST_NAME,
(
SELECT
t2.value
FROM
dbo.table t2
WHERE
t2.id = t.id
AND t2.instance = t.instance
AND t2.name = 'AGE'
) AS AGE,
(
SELECT
t2.value
FROM
dbo.table t2
WHERE
t2.id = t.id
AND t2.instance = t.instance
AND t2.name = 'STATE'
) AS STATE
FROM
dbo.table t
则...
问题1 - 虽然选择了所有字段,但如果需要,您只能获取状态
SELECT
*
FROM
dbo.view1 v
WHERE
v.age = (
SELECT
MAX(v2.age)
FROM
dbo.view1 v2
)
问题2 - 按字母顺序递增的第一个状态
SELECT
MIN(v.state) AS state
FROM
dbo.view1 v
WHERE
-- you can define a WHERE condition to meet your requirements here
v.age = 25
如果您喜欢,请提供此答案或将其标记为可接受:)