0

たぶん、誰かが私が一日中戦ってきたという声明に光を当てることができます:)

私は3つのテーブルを持っています

ホリデー

holidayID | userID | dateFrom   | dateTo
1         |      1 | 2012-01-01 | 2012-01-01
2         |      1 | 2012-01-15 | 2012-01-20

状態

statusID | holidayID | statusText
1        |         1 | accepted
2        |         2 | declined

ユーザー設定

id | userID | HolidaysAllowed
1  |      1 | 20

私がやろうとしているのは、次の結果を得ることです

結果

HolidaysAllowed | HolidaysLeft (Allowed - Taken) | HolidaysTaken (Sum of Holidays)
20              |                             19 |      1

ステータスを明記しなければ、3 つの列すべてを取得できます。取得した最も近いものを次に示します。

SELECT 
IFNULL(SUM( IF(  h.dateTo = h.dateFrom, 1, DATEDIFF( h.dateTo, h.dateFrom ) ) ), 0) AS holidaysTaken, 
IFNULL(us.HolidaysAllowed - ( SUM(  IF(  h.DateTo = h.DateFrom, 1, DATEDIFF( h.DateTo, h.dateFrom ) ) ) ), 0) AS holidaysLeftover, 
us.HolidaysAllowed
FROM userSettings us 
LEFT JOIN holiday h 
ON h.userID = 1 
JOIN status s 
ON s.holidayID = h.holidayID AND s.statusID = 1 
WHERE 
us.userID = 1
GROUP BY h.userID;

主な問題は、statusID = 2 の休日がない場合、結果の列 1 と 2 は 0 (正しい) ですが、列 3 (HolidaysAllowed) は NULL (常にテーブル UserSettings から値を返す必要があるため正しくない) です。 . 上記のクエリは、正しいステータスのレコード (休日) が少なくとも 1 つある場合にのみ正しい応答を返します...何が間違っていますか? :)

それは私を夢中にさせるだけです:)助けてくれてありがとう!とても有難い!

アップデート

コメントしてくださった皆様、ありがとうございます... 予想される結果は次のとおりです。ステータスが 1 (つまり、承認済み) の休日をすべて取得し、許可された休日の統計と比較して休日の統計を計算します。いえ

通算20日、休日1日受付=残り19日

再度、感謝します

4

3 に答える 3

3
SELECT u.userID, u.HolidaysAllowed,
u.holidaysAllowed - 
COALESCE( 
    (SELECT SUM( DATEDIFF( h1.dateTo, h1.dateFrom) + 1) 
         FROM holiday h1 
         INNER JOIN status s1
         ON s1.holidayID = h1.holidayID
         WHERE h1.userID = u.userID
         AND s1.statusID = 1
     ), 0) AS HolidaysLeft,
COALESCE( 
    (SELECT SUM( DATEDIFF( h2.dateTo, h2.dateFrom) + 1) 
         FROM holiday h2 
         INNER JOIN status s2
         ON s2.holidayID = h2.holidayID
         WHERE h2.userID = u.userID
         AND s2.statusID = 1
     ), 0) AS HolidaysTaken
FROM userSettings u
;
于 2012-04-28T22:12:08.137 に答える
2

次のクエリでは、週末は考慮されていません。

SQL Fiddle でデモを表示するには、ここをクリックしてください。

スクリプト:

CREATE TABLE Holiday 
(       
        holidayid   INT         NOT NULL AUTO_INCREMENT
    ,   userid      VARCHAR(20) NOT NULL 
    ,   dateFrom    DATETIME    NOT NULL 
    ,   dateTo      DATETIME    NOT NULL 
    ,   PRIMARY KEY(holidayid)
);

CREATE TABLE Status
(       
        id          INT         NOT NULL AUTO_INCREMENT
    ,   holidayid   INT         NOT NULL
    ,   statusid    INT         NOT NULL
    ,   PRIMARY KEY(id)
);

CREATE TABLE UserSettings
(       
        id              INT     NOT NULL AUTO_INCREMENT
    ,   userid          INT     NOT NULL
    ,   HolidaysAllowed INT     NOT NULL
    ,   PRIMARY KEY(id)
);

INSERT INTO  Holiday (userid, dateFrom, dateTo) VALUES
    (1, '2012-04-01', '2012-04-03'),
    (2, '2012-04-04', '2012-04-05'),
    (2, '2012-04-07', '2012-04-09'),
    (3, '2012-04-09', '2012-04-12'),
    (3, '2012-04-16', '2012-04-16'),
    (1, '2012-04-19', '2012-04-22');

INSERT INTO  Status (holidayid, statusid) VALUES
    (1, 2),
    (2, 1),
    (3, 1),
    (4, 1),
    (5, 2),
    (6, 2);

INSERT INTO  UserSettings (userid, HolidaysAllowed) VALUES
    (1, 5),
    (2, 10),
    (3, 7),
    (4, 6);


SELECT  u.userid
    ,   u.HolidaysAllowed
    ,   u.HolidaysAllowed - COALESCE(hol.HolidaysTaken, 0) AS HolidaysLeft
    ,   COALESCE(hol.HolidaysTaken, 0) AS HolidaysTaken
FROM
(
    SELECT          h.userid
                ,   ABS(SUM(
                      CASE 
                        WHEN statusid = 1 THEN DATEDIFF(dateTo, dateFrom) + 1
                        ELSE 0 END
                    )) HolidaysTaken

    FROM            UserSettings    us
    LEFT OUTER JOIN Holiday         h
    ON              us.userid       = h.userid
    LEFT OUTER JOIN Status          s
    ON              s.holidayid     = h.holidayid
    GROUP BY        h.userid
)                   hol
RIGHT OUTER JOIN    UserSettings u
ON                  u.userid = hol.userid;

出力:

USERID HOLIDAYSALLOWED HOLIDAYSLEFT HOLIDAYSTAKEN
------ --------------- ------------ -------------
1             5              5            0
2            10              5            5
3             7              3            4
4             6              6            0
于 2012-04-28T22:29:46.867 に答える
0
SELECT B.HolidaysAllowed AS HolidaysAllowed,
       B.HolidaysAllowed-A.HolidaysTaken AS HolidaysLeft,
       A.HolidaysTaken AS HolidaysTaken
FROM
(
 SELECT A.userID,SUM(CASE WHEN DATEDIFF(A.dateTo,A.dateFom)=0
                          THEN 1
                          ELSE DATEDIFF(A.dateTo,A.dateFom)
                    ) AS HolidaysTaken
 FROM Holiday A,Status B
 WHERE A.holidayID = B.holidayID
   AND A.statusText='accepted'
 GROUP BY useID
) A,
UserSettings B
WHERE A.userID = B.userID;
于 2012-04-28T22:11:13.447 に答える