0

blast_seconds我在显示为正确值时遇到问题。在我的 select 子查询中,我需要blast_seconds在我的主 Select 语句中同时显示 。执行查询时YearMonthScheduledSecondsTotalDaysTotaltrucks匹配,但blast_seconds列在所有月份中显示相同的值。

这是我的查询:

SELECT      DATEPART(YEAR, [Time])      AS [Year]
        ,   DATEPART(MONTH, [Time])     AS [Month]
        ,   SUM(Total)                  AS ScheduledSeconds
        ,   COUNT(DISTINCT([Time]))     AS TotalDays
        ,   COUNT(DISTINCT(Equipment))  AS TotalTrucks
        ,   (
                SELECT      SUM(CASE 
                                    WHEN dbo.reasons.status_id = '298' 
                                        THEN (dbo.by_operator_reasons.seconds) 
                                    ELSE 0 
                                END)        
                FROM        dbo.reasons     
                INNER JOIN  by_operator_reasons 
                ON          dbo.reasons.id = by_operator_reasons.reason_id
                INNER JOIN  equipment
                ON          by_operator_reasons.equipment_id = equipment.id     
                WHERE       reasons.descrip LIKE 'Blast' 
                AND         [Time] BETWEEN '2011-01-01' AND '2012-05-15'
                AND         by_operator_reasons.deleted_at IS NULL
                AND         equipment.type = 'Truck'
            ) AS Blast_Seconds              
FROM        by_equipment_times
WHERE       [Time] BETWEEN '2011-01-01' and '2012-05-15' 
AND         equipment_type  = 'Truck'
GROUP BY    DATEPART(YEAR, [Time])
        ,   DATEPART(MONTH, [Time])
ORDER BY    DATEPART(YEAR, [Time])      ASC
        ,   DATEPART(MONTH, [Time])     ASC

这是我当前的输出:

Year  Month  SchedSec  Days  TotalTrucks  Blast_Seconds
----  -----  --------  ----  -----------  -------------
2011    1    51340448   31        20      4931156
2011    2    51979509   28        22      4931156
2011    3    58845600   31        22      4931156
2011    4    59121967   30        24      4931156
2011    5    66857271   31        25      4931156
2011    6    67306766   30        28      4931156
2011    7    76976358   31        30      4931156
2011    8    80393145   31        30      4931156
2011    9    75556005   30        30      4931156
2011    10   77741205   31        29      4931156
2011    11   75272400   30        29      4931156
2011    12   77691044   31        29      4931156
2012    1    77683752   31        29      4931156
2012    2    72662400   29        29      4931156
2012    3    77574538   31        29      4931156
2012    4    75172177   30        29      4931156
2012    5    37584000   15        29      4931156
4

2 回答 2

0

这很可能是因为您没有告诉

Select SUM(CASE WHEN dbo.reasons.status_id = '298' 
    then (dbo.by_operator_reasons.seconds) ELSE 0 END.... 

子查询以获取相应行的值 - 它只是将找到的所有内容相加。您必须将子查询绑定到主查询 - 例如

[...]
    AND equipment.equipemnt_id_or_something = T1.equipment_id_or_something
    ) AS Blast_Seconds              
FROM        by_equipment_times as T1
[...]

或者我认为.... :)

PS。字段名称是虚构的。

于 2012-05-16T19:45:12.670 回答
0

The subquery is not corelated to main query, that is it does not depend on it. You need to connect it, and I believe that you want to do it using Time column.

SELECT      DATEPART(YEAR, [Time])      AS [Year]
        ,   DATEPART(MONTH, [Time])     AS [Month]
        ,   SUM(Total)                  AS ScheduledSeconds
        ,   COUNT(DISTINCT([Time]))     AS TotalDays
        ,   COUNT(DISTINCT(Equipment))  AS TotalTrucks
        ,   (
                SELECT      SUM(CASE 
                                    WHEN dbo.reasons.status_id = '298' 
                                        THEN (dbo.by_operator_reasons.seconds) 
                                    ELSE 0 
                                END)        
                FROM        dbo.reasons     
                INNER JOIN  by_operator_reasons 
                ON          dbo.reasons.id = by_operator_reasons.reason_id
                INNER JOIN  equipment
                ON          by_operator_reasons.equipment_id = equipment.id     
                WHERE       reasons.descrip LIKE 'Blast' 
                AND         DATEPART(YEAR, [Time]) = DATEPART(YEAR, by_equipment_times.[Time])
                AND         DATEPART(MONTH, [Time]) = DATEPART(MONTH, by_equipment_times.[Time])
                AND         by_operator_reasons.deleted_at IS NULL
                AND         equipment.type = 'Truck'
            ) AS Blast_Seconds              
FROM        by_equipment_times
WHERE       [Time] BETWEEN '2011-01-01' and '2012-05-15' 
AND         equipment_type  = 'Truck'
GROUP BY    DATEPART(YEAR, [Time])
        ,   DATEPART(MONTH, [Time])
ORDER BY    DATEPART(YEAR, [Time])      ASC
        ,   DATEPART(MONTH, [Time])     ASC

If you regularly take more than few months it would probably pay off to convert subquery to derived table, grouping by year/month and outer-joining to main query.

于 2012-05-16T20:10:53.210 回答