如何根据sql中的日期获取数据

时间:2014-10-05 10:00:42

标签: sql vb.net sql-server-2008

我有一个表truck_data,列truck_no, diesel_filled, source, destination, amount

我想仅提取truck_nodiesel_filled,以便在整个月内显示每辆卡车中diesel_filled的详细信息。

请告诉我SQL查询 - 我曾尝试过此查询,但它无法正常工作

SELECT 
   truck_no, diesel_filled, date 
FROM 
   truck-data 
ORDER BY 
   date

请帮帮我

提前致谢

我想要这样的输出

truck_no   1    2   3   4   5   6   7    8   9 etc(date from 1 to 31))
---------------------------------------------------------------------------
xyz       25   22  33  33  22  22  22  0   0 (diesel filled in truck order by date)
pqr       25   25  22  11  22  00  22  55  22
abc       21   15  12  14  13  00  22  00  00

2 个答案:

答案 0 :(得分:1)

您可以使用PIVOT operator获得这些结果,但开始日期和结束日期必须在同一个月内

DECLARE 
    @StartDate DATE = '20141001', 
    @EndDate DATE = '20141031';

SELECT  pvt.truck_no,
    ISNULL(pvt.[1], 0) AS Day1, 
    ISNULL(pvt.[2], 0) AS Day2,
    ISNULL(pvt.[3], 0) AS Day3,
    ISNULL(pvt.[4], 0) AS Day4,
    ISNULL(pvt.[5], 0) AS Day5,
    ISNULL(pvt.[6], 0) AS Day6,
    ISNULL(pvt.[7], 0) AS Day7,
    ISNULL(pvt.[8], 0) AS Day8,
    /*...*/
    ISNULL(pvt.[31], 0) AS Day31
FROM (
    SELECT  t.truck_no, t.diesel_filled, DAY(t.[date]) AS day_filled
    FROM    (VALUES 
        ('t#1', 100, '20140915'),('t#1', 110, '20141001'),('t#1', 120, '20141001'),('t#1', 105, '20141002'),
        ('t#2', 10, '20141001'),('t#2', 20, '20141001'),('t#2', 55, '20141003'),
        ('t#3', 20, '20141004'),('t#3', 20, '20141002'),('t#3', 75, '20141008')
    ) t(truck_no, diesel_filled, [date])
    WHERE   t.[date] BETWEEN @StartDate AND @EndDate
) x
PIVOT( SUM(x.diesel_filled) FOR x.day_filled IN ([1],[2],[3],[4],[5],[6],[7],[8],/*...*/[31]) ) pvt

答案 1 :(得分:0)

目前还不清楚你想要什么。但我认为你正在混合演示和数据

SELECT truck_no,diesel_filled,date 
FROM truck-data 
ORDER BY date

将按日期排序所有行。据推测,你只需要过滤一些特定的月份。

SELECT truck_no,diesel_filled,date 
FROM truck-data 
WHERE date >= 2014-10-05 AND date < 2014-11-01 ORDER BY date

获取今年10月份的所有行。如果此处的日期是DateTime列。

然后您可以将其更改为:

SELECT truck_no,sum(diesel_filled),Day(date) 
FROM truck-data 
WHERE date >= 2014-10-05 AND date < 2014-11-01 
GROUP BY truck_no
ORDER BY date"

这样每天只能给你一排卡车。如果disel_filled是某种数值。

然后在您的用户界面中,您必须以您喜欢的任何方式进行演示。例如,在某种类型的数据透视表中,如上面的描述。 当然,您也可以在SQL中执行此操作,但通常这是表示层的工作。 如果你真的想在SQL中做,你可以调查:http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx 如果你使用MsSql。