【问题标题】:Get multiple rows from query从查询中获取多行
【发布时间】:2014-08-14 08:43:01
【问题描述】:
SELECT           USERINFO.UserID
                ,SUM(DATEDIFF(DAY, DateFrom, DateTo) + 1) AS total_leave_days
FROM            USERINFO 
INNER JOIN      CHECKINOUT ON USERINFO.USERID = CHECKINOUT.USERID 
LEFT OUTER JOIN DEPARTMENTS ON DEPARTMENTS.DEPTID = USERINFO.DEFAULTDEPTID 
left join       AuthLeave on AuthLeave.userid = userinfo.userid
                and AuthLeave.DATEFROM>='2014-01-01' 
                and AuthLeave.DATETO<='2014-06-30'

WHERE           (CHECKINOUT.CHECKTIME >= '2014-01-01') 
                AND (CHECKINOUT.CHECKTIME <= '2014-06-30') 
                AND  DEPARTMENTS.DEPTNAME = 'GEN/SUP-TBL'

GROUP BY        USERINFO.UserID

这是我的代码,我可以在下面输出

UserID  total_leave_days
35      NULL
350     NULL
30      NULL
10      735
167     NULL
21      920
1       621
224     NULL

所以下面是我的 Authleave 表数据不正确:

UserID         DATEFROM           DATETO
 1            2014-03-10     2014-03-15 
 10           2014-05-28     2014-05-29
 21           2014-05-27     2014-05-27 
 1            2014-04-10     2014-04-15

从现在开始我想要如下输出:

UserID  total_leave_days
    35      NULL
    350     NULL
    30      NULL
    10      2
    167     NULL
    21      1
    1       12
    224     NULL

那我该怎么做呢?

【问题讨论】:

  • left join AuthLeave on AuthLeave.userid = userinfo.userid更改为inner join AuthLeave on AuthLeave.userid = userinfo.userid
  • 不,它不工作..
  • 这个左连接应该在你的左外连接之上...
  • 你确定CHECKINOUT 中每个用户ID 没有更多的行吗?这可能会导致更高的数字。你能发布所有涉及的表的 DDL 吗?
  • CHECKINOUTDEPARTMENTS的样表呢?如果可能的话,你应该尝试制作一些sqlfiddle demo

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

你能试试这个 SQL

SELECT      U.[UserID],
            C.[Leave]
FROM        [USERINFO] U 
LEFT JOIN   (SELECT     [UserID],  
                        SUM(DATEDIFF(DAY,[DATEFROM],[DATETO])) [Leave]
            FROM        [CHECKINOUT]
            WHERE       [CHECKTIME] >= '2014-01-01' AND [CHECKTIME] <= '2014-06-30'
            GROUP BY    [UserID]
            ) C ON U.[USERID] = C.[USERID]
LEFT JOIN   [DEPARTMENTS] D ON D.[DEPTID] = U.[DEFAULTDEPTID] 
LEFT JOIN   [AuthLeave] A on A.[userid] = U.[userid]
WHERE       D.[DEPTNAME] = 'GEN/SUP-TBL'
enter code here

编辑:

看到下面的 SQL,我对表名有点困惑。

SELECT      U.[UserID],
            L.[Leave]
FROM        [USERINFO] U 
JOIN        CHECKINOUT C ON U.USERID = C.USERID 
LEFT JOIN   [DEPARTMENTS] D ON D.[DEPTID] = U.[DEFAULTDEPTID] 
LEFT JOIN   (SELECT     [UserID],  
                        SUM(DATEDIFF(DAY,[DATEFROM],[DATETO])) [Leave]
            FROM        [AuthLeave]
            WHERE       [DATEFROM] >= '2014-01-01' AND [DATETO] <= '2014-06-30'
            GROUP BY    [UserID]
            ) L ON L.[UserID] =U.[UserID]
WHERE       D.[DEPTNAME] = 'GEN/SUP-TBL'
AND         C.[CHECKTIME] >= '2014-01-01' AND C.[CHECKTIME] <= '2014-06-30'

【讨论】:

  • 给出错误 - 消息 207,级别 16,状态 1,第 5 行无效的列名称“DATEFROM”。消息 207,级别 16,状态 1,第 5 行无效的列名称“DATETO”。消息 4104,级别 16,状态 1,第 12 行无法绑定多部分标识符“DEPARTMENTS.DEPTNAME”。
  • CHECKINOUT表的列名是什么?
  • CHECKTIME 是列名
  • 你必须给你的子查询起别名
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 2015-08-04
  • 2012-08-29
  • 2014-04-26
相关资源
最近更新 更多