构建SQL查询

时间:2009-12-29 09:50:30

标签: asp.net sql sql-server sql-server-2005

我需要一些帮助来构建SQL Query。我的表有如下数据:

ID   Date         Value1 Value2 Code
1   12/01/2009     4       3.5     abc
2   12/02/2009     3       4.0     abc
3   11/03/2009     6       8.5     xyz
4   11/01/2009     2       5.5     abc
5   11/02/2009     4       6.0     xyz
6   12/03/2009     5       7.0     xyz

我需要显示类似......的结果。

        ---------
Code   | Data   |    November(Sum of Values in month)      December   Jan   Feb
abc    | Value1 |           2                                 7       0       0
       | Value2 |           5                                 7       0       0
xyz    | Value1 |           10                                5       0       0
       | Value2 |           14                                7       0       0
       ----------

我需要每个月的价值总和,如同group by code列中的上述数据一样。

2 个答案:

答案 0 :(得分:2)

看看这个解决方案,让我知道你的想法。

您必须在此实例中同时使用 PIVOT和UNPIVOT 来获取您要查找的结果。希望这会有所帮助。

DECLARE @Table TABLE(
        ID INT,
        Date DATETIME,
        Value1 INT,
        Value2 FLOAT,
        Code VARCHAR(10)
)

INSERT INTO @Table (ID,Date,Value1,Value2,Code) SELECT  1,'12/01/2009',4,3,'abc'
INSERT INTO @Table (ID,Date,Value1,Value2,Code) SELECT  2,'12/02/2009',3,4,'abc'
INSERT INTO @Table (ID,Date,Value1,Value2,Code) SELECT  3,'11/03/2009',6,8,'xyz'
INSERT INTO @Table (ID,Date,Value1,Value2,Code) SELECT  4,'11/01/2009',2,5,'abc'
INSERT INTO @Table (ID,Date,Value1,Value2,Code) SELECT  5,'11/02/2009',4,6,'xyz'
INSERT INTO @Table (ID,Date,Value1,Value2,Code) SELECT  6,'12/03/2009',5,7,'xyz'


;WITH UnPvt AS (
        SELECT  *
        FROM    (
                    SELECT  Code,
                            DATENAME(MM, Date) MonthNameVal,
                            SUM(Value1) Value1,
                            SUM(Value2) Value2
                    FROM    (
                                SELECT  Code,
                                        Date,
                                        CAST(Value1 AS FLOAT) Value1,
                                        Value2
                                FROM    @Table
                            ) v
                    GROUP BY    Code,
                                DATENAME(MM, Date)
                ) Sub
        UNPIVOT
                (
                    Vals FOR RowValues IN (Value1, Value2)
                ) AS UnPvt
)
SELECT  *
FROM    UnPvt
PIVOT   (
            SUM(Vals)
            FOR MonthNameVal IN ([January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November], [December])
        ) AS pvt
ORDER BY Code, RowValues

看看

答案 1 :(得分:0)

这不是你要求的,因为列数是固定的,但我认为这是你想要的SQL更好的方式:

SELECT Code, 'Value1' As Data, MONTH(Date) AS Month, YEAR(Date) AS Year, SUM(Value1) AS Sum
FROM Table1
GROUP BY Code, MONTH(Date), YEAR(Date)
UNION ALL
SELECT Code, 'Value2' As Data, MONTH(Date) AS Month, YEAR(Date) AS Year, SUM(Value2) AS Sum
FROM Table1
GROUP BY Code, MONTH(Date), YEAR(Date)
ORDER BY Code, Data, Month, Year

示例输出:

Code Data   Month   Year    Sum
abc  Value1 11  2009    2
abc  Value1 12  2009    7
abc  Value2 11  2009    5
abc  Value2 12  2009    7
xyz  Value1 11  2009    10
xyz  Value1 12  2009    5
xyz  Value2 11  2009    14
xyz  Value2 12  2009    7

我建议您使用一些非SQL代码将结果重新格式化为您在向用户显示之前所要求的内容,而不是尝试在SQL中返回可变数量的列。