如何将子查询链接到主查询?

时间:2012-05-16 19:25:07

标签: sql sql-server-2008-r2

我遇到问题,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

2 个答案:

答案 0 :(得分: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。 字段名称是虚构的。

答案 1 :(得分:0)

子查询没有与主查询相关联,也就是说它不依赖于它。你需要连接它,我相信你想使用Time列来实现它。

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

如果您经常花费几个月的时间,将子查询转换为派生表,按年/月分组以及外部加入主查询可能会有所回报。