【问题标题】:SQL Sub Query splitting results into two rowsSQL Sub Query 将结果拆分为两行
【发布时间】:2014-09-08 02:06:05
【问题描述】:

我有一个 SQL 查询,它使用子查询从主查询中未使用的表中计算一些结果。我有一个问题,即单个结果(2.1 和 2.2)的结果被放在两行,所以 2.1 结果在那里,2.2 在一行上是 0,反之亦然。我希望它像下面的预期结果。

    SELECT DISTINCT

    DATEPART(week, SS.timearrived) 
        AS [Week No],

    SS.timearrived
        AS [Date],

    RTRIM(SS.vname)
        AS [V Name],    

    SS.vyid
        AS [Vy ID],

    ((SELECT CASE WHEN
                 (select COUNT(*)
    FROM  IME 
    WHERE IME.topos = SS.visid  and XCHE.sname IN ('2.1','2.2')
                      AND movek != 'Y' AND movek != 'S'
    GROUP BY IME.topos) IS NULL
    THEN '0'
    else (select COUNT(*)
    FROM  IME 
    WHERE IME.topos = SS.visid  and XCHE.sname IN ('2.1','2.2')
                      AND movek != 'Y' AND movek != 'S'
    GROUP BY IME.topos)
    END )

     + (SELECT CASE WHEN
                 (select COUNT(*)
    FROM  IME 
    WHERE IME.fmpos = SS.visid  and XCHE.sname IN ('2.1','2.2')
    GROUP BY IME.fmpos) IS NULL
    THEN '0'
    else (select COUNT(*)
    FROM  IME 
    WHERE IME.fmpos = SS.visid and XCHE.sname IN ('2.1','2.2')
    GROUP BY IME.fmpos)
    END)
    )/(
    convert(float,datediff(mi, swork, ework))/60 )

        AS [GBP T2],

    ((SELECT CASE WHEN
                 (select COUNT(*)
    FROM  IME 
    WHERE IME.topos = SS.visid  and XCHE.sname IN ('2.1')
                      AND movek != 'Y' AND movek != 'S'
    GROUP BY IME.topos) IS NULL
    THEN '0'
    else (select COUNT(*)
    FROM  IME 
    WHERE IME.topos = SS.visid  and XCHE.sname IN ('2.1')
                      AND movek != 'Y' AND movek != 'S'
    GROUP BY IME.topos)
    END )

     + (SELECT CASE WHEN
                 (select COUNT(*)
    FROM  IME 
    WHERE IME.fmpos = SS.visid  and XCHE.sname IN ('2.1')
    GROUP BY IME.fmpos) IS NULL
    THEN '0'
    else (select COUNT(*)
    FROM  IME 
    WHERE IME.fmpos = SS.visid and XCHE.sname IN ('2.1')
    GROUP BY IME.fmpos)
    END)
    )/(
    convert(float,datediff(mi, swork, ework))/60 )

        AS [GCP 2.1],

    ((SELECT CASE WHEN
                 (select COUNT(*)
    FROM  IME 
    WHERE IME.topos = SS.visid  and XCHE.sname IN ('2.2')
                      AND movek != 'Y' AND movek != 'S'
    GROUP BY IME.topos) IS NULL
    THEN '0'
    else (select COUNT(*)
    FROM  IME 
    WHERE IME.topos = SS.visid  and XCHE.sname IN ('2.2')
                      AND movek != 'Y' AND movek != 'S'
    GROUP BY IME.topos)
    END )

     + (SELECT CASE WHEN
                 (select COUNT(*)
    FROM  IME 
    WHERE IME.fmpos = SS.visid  and XCHE.sname IN ('2.2')
    GROUP BY IME.fmpos) IS NULL
    THEN '0'
    else (select COUNT(*)
    FROM  IME 
    WHERE IME.fmpos = SS.visid and XCHE.sname IN ('2.2')
    GROUP BY IME.fmpos)
    END)
    )/(
    convert(float,datediff(mi, swork, ework))/60 )

        AS [GCP 2.2]

    FROM    SS
    LEFT OUTER JOIN VCME ON SS.visid = vgk 
    LEFT OUTER JOIN VVVD ON SS.visid = fs01
    LEFT OUTER JOIN VCS ON VVVD.vvdgk = VCS.vvdgk
    LEFT OUTER JOIN VCSD ON VCS.gk = VCSD.csgk
    INNER JOIN XCHE on VCS.cgk = XCHE.gk

当前结果

    Week No     Date                        V Name      Vy ID       GBP T2      GCP 2.1     GCP 2.2
    14          2013-03-31 00:01:00.000     FORD        30580       18.72       0           18.72
    14          2013-03-31 00:01:00.000     FORD        30580       18.72       18.72       0

预期结果

    Week No     Date                        V Name      Vy ID       GBP T2      GCP 2.1     GCP 2.2
    14          2013-03-31 00:01:00.000     FORD        30580       18.72       18.72       18.72

【问题讨论】:

  • 如果可能,请分享架构结构
  • 结构只是基于底部的连接,表之间没有其他链接

标签: sql join subquery case multiple-results


【解决方案1】:

在您的最终查询中,将其用作最外层查询以获得您想要的结果。

SELECT    `Week No` ,      Date  ,   `V Name`, `Vy ID`,  `GBP T2`,
MAX(`GCP 2.1`), MAX(`GCP 2.2`) 
FROM
( -------------------  REST OF THE INNER QUERY HERE  --------------)
GROUP BY  `Week No` ,      Date  ,   `V Name`, `Vy ID`,  `GBP T2`;

【讨论】:

    猜你喜欢
    • 2020-11-26
    • 2014-09-06
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多