从pivot中选择MAX Value

时间:2014-05-08 16:51:32

标签: sql max

我正在开发一个用户输入姓名,年龄,居住州的应用程序。我们希望捕获用于各种事物的状态。当只列出一个姓名,年龄,居住州时,非常直接。在某些情况下,用户可以列出多个姓名,年龄,居住州。所有数据都存储在一个名为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作为居住国返回,因为它首先按字母顺序排列

我考虑了这两种情况。两者都不保证会发生。用户只能输入一条记录。无论哪种方式,总是返回居住国。我希望这更有意义。我试图像你上面看到的那样转动数据,但是不明白如何获得我需要的状态。感谢。

1 个答案:

答案 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

如果您喜欢,请提供此答案或将其标记为可接受:)