【问题标题】:SQL Server combine multiple queries on same table into single resultsetSQL Server 将同一张表上的多个查询组合成一个结果集
【发布时间】:2013-07-24 22:52:04
【问题描述】:

我见过类似的问题,但找不到解决这个问题的方法。忍受乱七八糟的桌子,问题应该是什么?非常坦率的。

我有下表。

LDTime                      Value
2013-07-24 00:00:00.000     14.85
2013-07-24 00:00:00.000     1.339
2013-07-24 00:15:00.000     95.9
2013-07-24 00:15:00.000     1.285
2013-07-24 00:30:00.000     160
2013-07-24 00:30:00.000     0.952

第 1、3 和 5 行是一种数据。 2、4 和 6 是另一种类型。我有以下查询可以根据过滤条件检索类型:

SELECT 
    A.LDTime, A.Value As AValue
FROM      
    Table7 G 
INNER JOIN
     Table1 A 
INNER JOIN
     Table2 B ON A.DataSetIdx = B.DataSetIdx 
INNER JOIN
     Table3 C ON B.RetrievalIdx = C.RetrievalIdx ON G.ActionIdx = C.ActionIdx 
INNER JOIN
     Table4 D ON G.SpatialRefIdx = D.SpatialRefIdx 
INNER JOIN
     Table5 E 
INNER JOIN
     Table6 F ON E.StationIdx = F.StationIDx ON D.SpatialRefIdx = E.SpatialRefIdx
WHERE 
     F.StationIDx = 1 
     AND A.ParameterIdx = 18
     AND A.LDTime BETWEEN '2013-7-24' AND '2013-7-25'
ORDER 
     BY A.LDTime


SELECT 
    A.LDTime, A.Value As BValue
FROM
    Table7 G 
INNER JOIN
    Table1 A 
INNER JOIN
    Table2 B ON A.DataSetIdx = B.DataSetIdx 
INNER JOIN
    Table3 C ON B.RetrievalIdx = C.RetrievalIdx ON G.ActionIdx = C.ActionIdx 
INNER JOIN
    Table4 D ON G.SpatialRefIdx = D.SpatialRefIdx 
INNER JOIN
    Table5 E 
INNER JOIN
    Table6 F ON E.StationIdx = F.StationIDx ON D.SpatialRefIdx = E.SpatialRefIdx
WHERE 
    F.StationIDx = 1 
    AND A.ParameterIdx = 19
    AND A.LDTime BETWEEN '2013-7-24' AND '2013-7-25'
ORDER BY 
     A.LDTime

请注意,我在两个查询之间只更改了一个过滤器变量(ParameterIdx),它区分了 value 列中存储的数据类型。

如何组合查询以生成一个结果集? (或者,我正在使用存储过程,所以这可以在多个查询中完成)。

LDTime                      AValue   BValue
2013-07-24 00:00:00.000     14.85    1.339
2013-07-24 00:15:00.000     95.9     1.285
2013-07-24 00:30:00.000     160      0.952

【问题讨论】:

    标签: sql sql-server-2005 stored-procedures


    【解决方案1】:

    应该这样做:

    SELECT a.LDTime
         , Avalue = MAX(CASE WHEN A.ParameterIdx = 18 THEN A.Value END)
         , BValue = MAX(CASE WHEN A.ParameterIdx = 19 THEN A.Value END)
    FROM         Table7 G INNER JOIN
    Table1 A INNER JOIN
    Table2 B ON A.DataSetIdx = B.DataSetIdx INNER JOIN
    Table3 C ON B.RetrievalIdx = C.RetrievalIdx ON G.ActionIdx = C.ActionIdx INNER JOIN
    Table4 D ON G.SpatialRefIdx = D.SpatialRefIdx INNER JOIN
    Table5 E INNER JOIN
    Table6 F ON E.StationIdx = F.StationIDx ON D.SpatialRefIdx = E.SpatialRefIdx
    WHERE F.StationIDx = 1 AND A.ParameterIdx in (18, 19)
    AND A.LDTime BETWEEN '2013-7-24' AND '2013-7-25'
    GROUP BY A.LDTime
    ORDER BY A.LDTime
    

    【讨论】:

    • 谢谢。今晚晚些时候我会试试这个。嗯,每 15 秒只允许发表一条评论……等待中。
    • Goat CO 和 Gordon Linoff 回答了这个问题。山羊的时间早了 2 分钟,所以我会给他(它?)答案。但两者都给出了相同的结果。
    【解决方案2】:

    唯一的区别似乎是where 子句。所以以下应该正确标记行:

    SELECT A.LDTime,A.Value,
           (case when F.StationIDx = 1 AND A.ParameterIdx = 18 then 'A'
                 when A.ParameterIdx = 19 then 'B'
            end) as AorB
    FROM         Table7 G INNER JOIN
    Table1 A INNER JOIN
    Table2 B ON A.DataSetIdx = B.DataSetIdx INNER JOIN
    Table3 C ON B.RetrievalIdx = C.RetrievalIdx ON G.ActionIdx = C.ActionIdx INNER JOIN
    Table4 D ON G.SpatialRefIdx = D.SpatialRefIdx INNER JOIN
    Table5 E INNER JOIN
    Table6 F ON E.StationIdx = F.StationIDx ON D.SpatialRefIdx = E.SpatialRefIdx
    WHERE F.StationIDx = 1 AND A.ParameterIdx in (18, 19)
    AND A.LDTime BETWEEN '2013-7-24' AND '2013-7-25'
    ORDER BY A.LDTime
    

    要执行您想要的操作,您需要在查询中添加group by。这将为您提供所需的结果:

    SELECT A.LDTime,
           max(case when A.ParameterIdx = 18 then Value end) as AValue,
           max(case when A.ParameterIdx = 19 then Value end) as BValue
    FROM         Table7 G INNER JOIN
    Table1 A INNER JOIN
    Table2 B ON A.DataSetIdx = B.DataSetIdx INNER JOIN
    Table3 C ON B.RetrievalIdx = C.RetrievalIdx ON G.ActionIdx = C.ActionIdx INNER JOIN
    Table4 D ON G.SpatialRefIdx = D.SpatialRefIdx INNER JOIN
    Table5 E INNER JOIN
    Table6 F ON E.StationIdx = F.StationIDx ON D.SpatialRefIdx = E.SpatialRefIdx
    WHERE F.StationIDx = 1 AND A.ParameterIdx in (18, 19)
    AND A.LDTime BETWEEN '2013-7-24' AND '2013-7-25'
    group BY A.LDTime
    order by 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-04
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 2017-07-24
      相关资源
      最近更新 更多