我有两个表,其中包含以下数据。
studenttbl
seatno  sname   coursename      scoursefee
------------------------------------------
1006    Vivek    MS-CIT           4500
1005    RAJESH   TALLY ERP        5200
1004    Anil     MS-CIT           4500
1003    ANKITA   OFFICE EXPERT    4200
1002    SACHIN   TALLY ERP        5200
1001    VIJAY    MS-CIT           4500feetbl
feeid   seatno  receivedamt receiptno   receiveddate
-----------------------------------------------------------
  1     1001        2500     1001   2021-10-02 06:27:28.000
  2     1002        2200     1002   2021-10-02 06:28:11.000
  3     1003        2700     1003   2021-10-02 06:29:03.000
  4     1003        500      1004   2021-10-02 06:32:20.000
  5     1004        1500     102    2021-10-02 07:02:37.000
  6     1004        1000     101    2021-10-02 07:08:03.000
  7     1005        5200     103    2021-10-02 07:23:46.000我需要找到以下数据,但我没有得到seatno 1006的平衡值:
jdate      seatno   sname   coursename  Scoursefee  paid    balance
-------------------------------------------------------------------
02 Oct 2021 1005    RAJESH  TALLY ERP       5200    5200    0
02 Oct 2021 1004    Anil    MS-CIT          4500    2500    2000
02 Oct 2021 1003    ANKITA  OFFICE EXPERT   4200    3200    1000
02 Oct 2021 1002    SACHIN  TALLY ERP       5200    2200    3000
02 Oct 2021 1001    VIJAY   MS-CIT          4500    2500    2000我正在使用这个SQL查询:
SELECT 
    CONVERT(VARCHAR, jdate, 106) AS jdate,
    st.seatno,
    sname,
    coursename,
    Scoursefee,
    SUM(ft.receivedamt) AS paid,
    st.Scoursefee - SUM(ft.receivedamt) AS balance
FROM 
    studenttbl st
INNER JOIN 
    feetbl ft ON st.seatno = ft.seatno
WHERE 
    JDate BETWEEN '1990-01-01 00:00:00'
              AND '2021-10-05 00:00:00'
GROUP BY 
    st.seatno, st.Scoursefee, sname, 
    jdate, coursename, Scoursefee
ORDER BY 
    st.seatno DESC请帮我弄一下这个。
发布于 2021-10-05 17:06:32
这个问题是由于内部连接和左连接造成的。当你使用内部连接时,你只能得到两个表之间的匹配。当您离开JOIN时,您将从左侧的表中获取所有值,并且仅从右侧获取匹配的值。
同样,在这个问题上,你的SUM函数也会崩溃。您需要在ISNULL(col,0)中包装左连接的表的列,这样您的聚合才能正常工作。
我还将WHERE子句中的日期比较更改为使用<=和>=。Aaron Bertrandt在这个话题上讲了几次,这里有一个很好的链接:
https://www.mssqltips.com/sqlservertutorial/9316/sql-server-between-dates-issue/
SELECT convert(VARCHAR, jdate, 106) AS jdate
    ,st.seatno
    ,sname
    ,coursename
    ,Scoursefee
    ,sum(ft.receivedamt) AS paid
    ,st.Scoursefee - sum(ISNULL(ft.receivedamt,0)) AS balance
FROM studenttbl st
LEFT JOIN feetbl ft ON st.seatno = ft.seatno
WHERE JDate >='1990-01-01 00:00:00'
        AND JDate <='2021-10-05 00:00:00'
GROUP BY st.seatno
    ,st.Scoursefee
    ,sname
    ,jdate
    ,coursename
    ,Scoursefee
ORDER BY st.seatno DESC发布于 2021-10-05 17:09:35
这是因为Seat 1006没有出现在feetbl表中。尝试对其执行左连接,以便从Studenttbl中提取所有信息。或者,将适当的数据添加到feetbl。
https://stackoverflow.com/questions/69454572
复制相似问题