【问题标题】:SQL 2 statements creating a 3 statement, and joining the 2 togetherSQL 2 语句创建一个 3 语句,并将 2 连接在一起
【发布时间】:2013-01-29 14:18:24
【问题描述】:

这是我的 SQL 语句:

SELECT repnr, DATEDIFF(day, MIN(start), MAX(start) +1) AS DaysTotal
FROM TBLstatus 
WHERE status IN (1, 2, 3, 4, 8, 11, 20, 7, 23)
GROUP BY repnr HAVING COUNT(*) = 2 AND MAX(Start) > GETDATE()-30

Select repnr as repnr, CONVERT(float, SUM(DATEDIFF(day, start, slut))) as extern
From TBLstatus 
where status IN (5, 15, 17)
group by repnr

第一个会返回这个数据:

repnr daystotal
1000  100
1001  90
1003  91

和第二条语句:

repnr extern
900   100
901   102
1000  21
1003  23

我想要的是 repnr(这是一个 ID)匹配的地方,我想减去 to 值,所以我看起来像这样:

repnr result
1000  79
1003  68

我如何为 MSSQL 执行此操作。

【问题讨论】:

    标签: sql-server select join


    【解决方案1】:
    SELECT q1.repnr, q1.daystotal - q2.extern as [result]
    FROM
    (
    SELECT repnr, DATEDIFF(day, MIN(start), MAX(start) +1) AS DaysTotal
    FROM TBLstatus 
    WHERE status IN (1, 2, 3, 4, 8, 11, 20, 7, 23)
    GROUP BY repnr HAVING COUNT(*) = 2 AND MAX(Start) > GETDATE()-30
    )q1
    INNER JOIN 
    (
    Select repnr as repnr, CONVERT(float, SUM(DATEDIFF(day, start, slut))) as extern
    From TBLstatus 
    where status IN (5, 15, 17)
    group by repnr
    )q2 ON q1.repnr = q2.repnr
    

    【讨论】:

      【解决方案2】:

      将您的查询设置为子查询并加入您的密钥,您应该一切顺利。

      select repnr, DaysTotal - extern as result from (SELECT repnr, DATEDIFF(day, MIN(start), MAX(start) +1) AS DaysTotal
      FROM TBLstatus 
      WHERE status IN (1, 2, 3, 4, 8, 11, 20, 7, 23)
      GROUP BY repnr HAVING COUNT(*) = 2 AND MAX(Start) > GETDATE()-30) a inner join (Select repnr as repnr, CONVERT(float, SUM(DATEDIFF(day, start, slut))) as extern
      From TBLstatus 
      where status IN (5, 15, 17)
      group by repnr) b on a.repnr = b.repnr
      

      【讨论】:

      • @Mathias 请问你为什么不接受我的答案,这个答案和我的有什么区别?
      • 这个好像更好,更短,select语句合并在一起了。
      • @Mathias 查询完全一样!他只是删除了换行符。
      【解决方案3】:
      SELECT a.repnr, ABS(A.daystotal - b.extern) AS result
      FROM(
      SELECT repnr, DATEDIFF(day, MIN(start), MAX(start) +1) AS DaysTotal
      FROM TBLstatus 
      WHERE status IN (1, 2, 3, 4, 8, 11, 20, 7, 23)
      GROUP BY repnr HAVING COUNT(*) = 2 AND MAX(Start) > GETDATE()-30
      )A
      JOIN(
      Select repnr as repnr, CONVERT(float, SUM(DATEDIFF(day, start, slut))) as extern
      From TBLstatus 
      where status IN (5, 15, 17)
      group by repnr
      )B
      ON A.repnr = b.repnr
      

      【讨论】:

        猜你喜欢
        • 2016-06-21
        • 1970-01-01
        • 2017-04-30
        • 2011-03-16
        • 1970-01-01
        • 2015-02-15
        • 2010-10-07
        • 1970-01-01
        • 2015-09-01
        相关资源
        最近更新 更多