SQL查询问题

时间:2011-03-30 01:20:28

标签: sql

当我在数据库上执行SQL查询时,数据库中的所有月份以及与该特定月份对应的所有值将在金额列中汇总。 假设这是一个表

Month     Category   Amount  Year
January   Rent       12      2011 
March     Food       13      2011
January   Gas        14      2011
May       Enter      15      2011
March     General    16      2011

所以我写了一下查询,用这个来汇总特定月份的所有值: -

"SELECT Month, SUM(Amount) AS OrderTotal FROM budget1 WHERE year="2011" GROUP BY month "

所以我得到了结果: -

Month       Amount
January      26
March       29
May       15

但我想要的是它应该显示从1月到12月的所有月份以及那个月前面的0值,这些数据库中没有这样的例子。

Month         Amount
January        26
February       0 
March         29
April          0
May         15
June           0
July           0
August         0
September      0
October        0
November       0
December       0 

任何帮助将不胜感激.. !!

2 个答案:

答案 0 :(得分:4)

创建一个包含Jan-Dec所有月份的表,称之为Months。只有一个带有名称的列或为排序顺序添加一个额外的整数(我通常称之为序数列),如下所示:

create table months (
    month varchar(20),
    ordinal
);

insert into months values ('January', 1);
insert into months values ('February', 2);
insert into months values ('March', 3);
...
insert into months values ('December', 12);

具体语法可能取决于您的数据库平台。然后,根据您的数据库:

SELECT months.Month, SUM(Amount) AS OrderTotal 
FROM months 
left join budget1
on months.month = budget1.Month
WHERE year="2011" or year is null
GROUP BY months.month, months.ordinal
ORDER by month.ordinal

当null时,您需要将SUM(Amount)转换为0。执行此操作的具体功能或方法取决于您的数据库平台,或者您可以在解释结果的代码中执行此操作。

答案 1 :(得分:1)

使用您的月份和排序顺序构建月份表。然后将您的月份列加入数据表中的月份列。那会给你零。

所以你的桌子看起来像

Month       Sort
======================
January     1
February    2
March       3
etc.

您可以使用Create Table创建表格,然后使用Insert Scripts

CREATE TABLE #months (month VARCHAR(50), sort INT);

INSERT INTO #months VALUES ('January', 1);

INSERT INTO #months VALUES ('February', 2);
etc.

然后

SELECT m.Month, SUM(Amount) AS OrderTotal 
FROM #months m LEFT OUTER JOIN budget1 on m.Month = budget1.Month
WHERE year=2011 
GROUP BY m.Month
ORDER BY m.Sort