1

列ID、USERSIDテーブルを持つテーブルusersがあります:

  t_A(ID,usersID,ADATE,priceA,priceB)
  t_B(ID,usersID,BDATE,priceA,priceB)
  t_C(ID,usersID,CDATE,priceA,priceB)

このクエリを使用して、X DATE と USERSID の 3 つのテーブルから価格の合計を取得しています

    declare @id int 
    set @id = 3 -- for example 

    SELECT SUM(priceA) as TA, SUM(priceB) as TB
    FROM  t_A,t_B,t_C
    WHERE  t_A.USERSID =  @id
    AND     t_B.USERSID =  @id
    AND     t_C.USERSID =  @id
    AND    ADATE >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, getdate())) 
   AND     BDATE >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, getdate())) 
   AND    CDATE >= DATEADD(DAY, 0, DATEDIFF(DAY, 0, getdate())) 

このスクリプトは、USERSID が 3 つのテーブルに行を持っている場合にのみ機能します。それ以外の場合、スクリプトは何も返しません。

4

3 に答える 3

1

1 つのテーブルだけに USERID = 3 がない場合、その結果は常に空になるためです。回避策: UNION ALL演算子でオプションを使用します。

DECLARE @id int 
SET @id = 3
SELECT SUM(x.priceA) as TA, SUM(x.priceB) AS TB
FROM (
      SELECT priceA, priceB
      FROM t_A 
      WHERE t_A.USERSID =  @id
        AND ADATE >= DATEDIFF(d,0,dateadd(d,0,getdate()))
      UNION ALL
      SELECT priceA, priceB
      FROM t_B 
      WHERE t_B.USERSID =  @id
        AND BDATE >= DATEDIFF(d,0,dateadd(d,0,getdate()))
      UNION ALL   
      SELECT priceA, priceB
      FROM t_C 
      WHERE t_C.USERSID =  @id
        AND CDATE >= DATEDIFF(d,0,dateadd(d,0,getdate()))
      ) x
于 2013-04-15T12:55:02.103 に答える
0

日付列を datediff と比較することはできません。できることは次のとおりです。

AND ADATE >= GETDATE()

また:

AND DATEDIFF(d, ADATE, GETDATE()) > 1

MSDN で構文といくつかの例を確認できます。

于 2013-04-15T12:47:59.707 に答える
0

これが必要だと思います。このように、テーブルの 1 つが条件を満たしている限り、結果が返されます。

SELECT SUM(priceA) as TA, SUM(priceB) as TB, SUM(priceC) as TC
    FROM  t_A
    FULL JOIN t_B
    FULL JOIN t_C
    WHERE  t_A.USERSID =  @id
    AND     t_B.USERSID =  @id
    AND     t_C.USERSID =  @id
    AND    ADATE >= DATEDIFF(d,0,dateadd(d,0,getdate()))
   AND     BDATE >= DATEDIFF(d,0,dateadd(d,0,getdate()))
   AND    CDATE >= DATEDIFF(d,0,dateadd(d,0,getdate()))
于 2013-04-15T12:54:35.623 に答える