Sql 提交查询以返回基于日期的多列?

Sql 提交查询以返回基于日期的多列?,sql,sqlite,Sql,Sqlite,我有一个表格,列出了员工的服务电话。我设置了一个视图来查看表中的发票总额 Select EmployeeID, SUM(InvoiceAmount) as "Total $ Amount Of Calls For January" From Calls WHERE Date BETWEEN '2013/01/01' AND '2013/01/31' Group by EmployeeID 这很好,但我每个月都要看12次,这似乎有点多余。我希望能够使用子查询来显示EmployeeID,然后在下面

我有一个表格,列出了员工的服务电话。我设置了一个视图来查看表中的发票总额

Select EmployeeID, SUM(InvoiceAmount) as "Total $ Amount Of Calls For January"
From Calls
WHERE Date BETWEEN '2013/01/01' AND '2013/01/31'
Group by EmployeeID
这很好,但我每个月都要看12次,这似乎有点多余。我希望能够使用子查询来显示EmployeeID,然后在下面列出每个月的总数

EmployeeID   JAN   FEB   MAR   APR ...
john         444   555   342   654
jim          945   675   232   465
我尝试了很多东西,但都无法接近…我需要这样的东西,但这很有效

SELECT   
EmployeeID, 

(SELECT SUM(InvoiceAmount) FROM Orders WHERE DATE BETWEEN '2013/01/01' AND '2013/01/31') AS JAN,

(SELECT SUM(InvoiceAmount) FROM Orders WHERE DATE BETWEEN '2013/02/01' AND '2013/02/28') AS FEB,

(SELECT SUM(InvoiceAmount) FROM Orders WHERE DATE BETWEEN '2013/03/01' AND '2013/03/31') AS MAR,

FROM Calls

您可以这样做:

SELECT EmployeeID, 
    SUM(
        CASE
            WHEN strftime('%m', Date) = '01'
                THEN InvoiceAmount
            ELSE 0
        END) AS 'Jan',
    SUM(
        CASE
            WHEN strftime('%m', Date) = '02'
                THEN InvoiceAmount
            ELSE 0
        END) AS 'Feb',
    ...
    SUM(
        CASE
            WHEN strftime('%m', Date) = '12'
                THEN InvoiceAmount
            ELSE 0
        END) AS 'Dec'
FROM Calls
WHERE Date BETWEEN '2013-01-01' AND '2013-12-31'
GROUP BY EmployeeID
如果你看的是某一年,这个方法很有效


您可以这样做:

SELECT EmployeeID, 
    SUM(
        CASE
            WHEN strftime('%m', Date) = '01'
                THEN InvoiceAmount
            ELSE 0
        END) AS 'Jan',
    SUM(
        CASE
            WHEN strftime('%m', Date) = '02'
                THEN InvoiceAmount
            ELSE 0
        END) AS 'Feb',
    ...
    SUM(
        CASE
            WHEN strftime('%m', Date) = '12'
                THEN InvoiceAmount
            ELSE 0
        END) AS 'Dec'
FROM Calls
WHERE Date BETWEEN '2013-01-01' AND '2013-12-31'
GROUP BY EmployeeID
如果你看的是某一年,这个方法很有效


我对数据库语法仍然很陌生,但是我使用的是sqlite而不是mysql,我的SQL经理说“if”是一个不正确的函数。不确定这是否会产生影响?此脚本最终返回,但列为空。我的日期格式为YYYY/MM/DD。这是sqlite的默认格式,但是在php中strftime可以定义日期的格式。这需要在这里完成吗?@derek希望我已经完成了最后一次更新。我是用这个查询创建的。谢谢,前面的一个可能也可以…我绞尽脑汁想知道日期格式是否是原因…我的日期被插入表中,作为2013/01/01而不是2013-01-01。我想我学到了一些新东西。再次感谢您抽出时间。我认为我对sql的基本知识让其他人很恼火,因为他们删除了他们的答案。@derek不,这不对。我只是删除了它,因为它似乎是我在激怒其他人谁不投票给我的答案。我发现这个答案更有帮助,它说出了我想说的话,他先发了出来。这就是我删除它的原因。很抱歉,我对数据库语法还是很陌生,但是我使用的是sqlite而不是mysql,我的SQL管理员说“if”是一个不正确的函数。不确定这是否会产生影响?此脚本最终返回,但列为空。我的日期格式为YYYY/MM/DD。这是sqlite的默认格式,但是在php中strftime可以定义日期的格式。这需要在这里完成吗?@derek希望我已经完成了最后一次更新。我是用这个查询创建的。谢谢,前面的一个可能也可以…我绞尽脑汁想知道日期格式是否是原因…我的日期被插入表中,作为2013/01/01而不是2013-01-01。我想我学到了一些新东西。再次感谢您抽出时间。我认为我对sql的基本知识让其他人很恼火,因为他们删除了他们的答案。@derek不,这不对。我只是删除了它,因为它似乎是我在激怒其他人谁不投票给我的答案。我发现这个答案更有帮助,它说出了我想说的话,他先发了出来。这就是我删除它的原因。对不起。