Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 组合具有重复id的多行_Sql_Sql Server - Fatal编程技术网

Sql 组合具有重复id的多行

Sql 组合具有重复id的多行,sql,sql-server,Sql,Sql Server,我的表是odb.OPMdata 列=id、要素、预算、月份 我要它做什么 此示例sql查询未显示Id为='1'的所有行,仅显示其最大值和最小值 SELECT month, MAX(budgetmonth) AS value1, MAX(actual) AS value2, MAX(variance) AS value3, MIN(budgetmonth) AS value4, MIN(actual) AS value5, MIN(variance) AS value6 FROM O

我的表是odb.OPMdata

列=id、要素、预算、月份

我要它做什么

此示例sql查询未显示Id为='1'的所有行,仅显示其最大值和最小值

SELECT month, MAX(budgetmonth) AS value1, MAX(actual) AS value2, MAX(variance) AS value3,
       MIN(budgetmonth) AS value4, MIN(actual) AS value5, MIN(variance) AS value6
FROM OPMdata
GROUP BY month
我的问题是如何将三个或更多重复行合并到一行中,并且值将显示在每列中

我想实现的就是这个

id | value1 | value2 | value3  | value4 |value5| value 6 | value7 | value8 |val9 

1  |  CC    |  100   | january |  FF    |  100 |february |  DD    |  200   |mar
对于具有相同id的其他行,依此类推。
请在此方面提供帮助,并提前感谢。

您可以尝试像此+月表这样的三重连接,以便正确订购:

;WITH months AS ( -- Table with months for ordering
SELECT DATENAME(month,'1970-01-01') as [month], 1 as [level]
UNION ALL
SELECT DATENAME(month,DATEADD(month,[level],'1970-01-01')), [Level]+1
FROM months
WHERE [level] < 12
)
, results AS ( --Temp cte with add of ROW_NUMBERS()
SELECT  id, 
        element, 
        budget, 
        o.[month],
        ROW_NUMBER() OVER (PARTITION BY Id ORDER BY m.[level]) as rn
FROM OPMdata o
LEFT JOIN months m
    ON m.[month] = o.[month]
)
--Final query:
SELECT TOP 1 WITH TIES 
        r.id,
        r.element,
        r.budget,
        r.[month],
        r1.element,
        r1.budget,
        r1.[month],
        r2.element,
        r2.budget,
        r2.[month]
FROM results r
LEFT JOIN results r1
    ON r.id = r1.id and r.rn = r1.rn-1
LEFT JOIN results r2
    ON r1.id = r2.id and r1.rn = r2.rn-1
ORDER BY r.rn
编辑:

如果要创建视图,可以使用以下查询:

CREATE VIEW ViewNameHere
AS
    WITH months AS ( -- Table with months for ordering
    SELECT DATENAME(month,'1970-01-01') as [month], 1 as [level]
    UNION ALL
    SELECT DATENAME(month,DATEADD(month,[level],'1970-01-01')), [Level]+1
    FROM months
    WHERE [level] < 12
    )
    , results AS ( --Temp cte with add of ROW_NUMBERS()
    SELECT  id, 
            element, 
            budget, 
            o.[month],
            ROW_NUMBER() OVER (PARTITION BY Id ORDER BY m.[level]) as rn
    FROM OPMdata o
    LEFT JOIN months m
        ON m.[month] = o.[month]
    )
    --Final query:
    --every column with unique name 'value*'
    SELECT TOP 1 WITH TIES 
            r.id        as value1,
            r.element   as value2,
            r.budget    as value3,
            r.[month]   as value4,
            r1.element  as value5,
            r1.budget   as value6,
            r1.[month]  as value7,
            r2.element  as value8,
            r2.budget   as value9,
            r2.[month]  as value10,
    FROM results r
    LEFT JOIN results r1
        ON r.id = r1.id and r.rn = r1.rn-1
    LEFT JOIN results r2
        ON r1.id = r2.id and r1.rn = r2.rn-1
    ORDER BY r.rn

有多少个可能的重复项?请添加OPMdata表中的数据样本。@sagi每个id的重复项可能为12个,因此您需要36列?是的,google-SQL Server pivot多个列,您将有大量答案,@gofr1我已经测试过它及其作品。谢谢你的出色查询。我使用sql研究运行你的查询。它给了我一个错误。错误如下:无法在网格窗格和图表窗格中表示SQL文本。我想您正在尝试创建视图。我说的对吗?是的@gofr1,因为我需要将其放入ASP并绑定到GridViews。您必须首先用唯一的名称命名每一列。当使用cte SSMS无法显示窗格时,必须忽略此警告,视图仍将创建。
CREATE VIEW ViewNameHere
AS
    WITH months AS ( -- Table with months for ordering
    SELECT DATENAME(month,'1970-01-01') as [month], 1 as [level]
    UNION ALL
    SELECT DATENAME(month,DATEADD(month,[level],'1970-01-01')), [Level]+1
    FROM months
    WHERE [level] < 12
    )
    , results AS ( --Temp cte with add of ROW_NUMBERS()
    SELECT  id, 
            element, 
            budget, 
            o.[month],
            ROW_NUMBER() OVER (PARTITION BY Id ORDER BY m.[level]) as rn
    FROM OPMdata o
    LEFT JOIN months m
        ON m.[month] = o.[month]
    )
    --Final query:
    --every column with unique name 'value*'
    SELECT TOP 1 WITH TIES 
            r.id        as value1,
            r.element   as value2,
            r.budget    as value3,
            r.[month]   as value4,
            r1.element  as value5,
            r1.budget   as value6,
            r1.[month]  as value7,
            r2.element  as value8,
            r2.budget   as value9,
            r2.[month]  as value10,
    FROM results r
    LEFT JOIN results r1
        ON r.id = r1.id and r.rn = r1.rn-1
    LEFT JOIN results r2
        ON r1.id = r2.id and r1.rn = r2.rn-1
    ORDER BY r.rn