3

私はこのサンプルデータを持っています

+------+------------+------------+
| CODE | START_DATE | END_DATE   |
+------+------------+------------+
| 0001 | 2012-01-01 | 2012-01-31 |
+------+------------+------------+
| 0001 | 2012-02-01 | 2012-02-29 |
+------+------------+------------+
| 0001 | 2012-03-01 | NULL       |
+------+------------+------------+
| 0002 | 2012-02-01 | 2012-02-29 |
+------+------------+------------+
| 0002 | 2012-03-01 | 2012-03-31 |
+------+------------+------------+
| 0002 | 2012-04-01 | NULL       |
+------+------------+------------+
| 0003 | 2012-02-01 | 2012-02-29 |
+------+------------+------------+
| 0003 | 2012-03-01 | 2012-03-31 |
+------+------------+------------+

DDL

CREATE TABLE SAMPLE
(
    CODE VARCHAR(4),
    START_DATE DATETIME,
    END_DATE DATETIME
)

INSERT INTO SAMPLE (CODE, START_DATE, END_DATE) VALUES ('0001', {d '2012-01-01'}, {d '2012-01-31'})
INSERT INTO SAMPLE (CODE, START_DATE, END_DATE) VALUES ('0001', {d '2012-02-01'}, {d '2012-02-29'})
INSERT INTO SAMPLE (CODE, START_DATE, END_DATE) VALUES ('0001', {d '2012-03-01'}, NULL)

INSERT INTO SAMPLE (CODE, START_DATE, END_DATE) VALUES ('0002', {d '2012-02-01'}, {d '2012-02-29'})
INSERT INTO SAMPLE (CODE, START_DATE, END_DATE) VALUES ('0002', {d '2012-03-01'}, {d '2012-03-31'})
INSERT INTO SAMPLE (CODE, START_DATE, END_DATE) VALUES ('0002', {d '2012-04-01'}, NULL)

INSERT INTO SAMPLE (CODE, START_DATE, END_DATE) VALUES ('0003', {d '2012-02-01'}, {d '2012-02-29'})
INSERT INTO SAMPLE (CODE, START_DATE, END_DATE) VALUES ('0003', {d '2012-03-01'}, {d '2012-03-31'})

このデータを取得する予定です

+------+------------+------------+
| CODE | START_DATE | END_DATE   |
+------+------------+------------+
| 0001 | 2012-01-01 | NULL       |
+------+------------+------------+
| 0002 | 2012-02-01 | NULL       |
+------+------------+------------+
| 0003 | 2012-02-01 | 2012-03-31 |
+------+------------+------------+

現在SQL Server 2005で、このクエリを使用しています

SELECT  CODE,
        MIN(START_DATE) AS START_DATE,
        CASE
            WHEN    MAX(ISNULL(END_DATE, {d '9999-12-31'})) = {d '9999-12-31'}
            THEN    NULL
        ELSE
            MAX(END_DATE)
        END AS END_DATE
FROM    SAMPLE
GROUP BY    CODE

私はこれまでに NULL 値をだましている 9999-12-31

これに対するより良い解決策を探しています

ありがとうございました

4

2 に答える 2

1

と列が異なるという事実を利用できCOUNTます。したがって、スクリプトは次のようになります。NULLNOT NULL

SELECT  CODE,
        MIN(START_DATE) AS START_DATE,
        CASE 
            WHEN    COUNT(*) > COUNT(END_DATE)
            THEN    NULL
        ELSE
            MAX(END_DATE)
        END AS END_DATE
FROM    SAMPLE
GROUP BY    CODE
于 2012-12-03T10:04:26.053 に答える
0

このスクリプトは、cte (共通テーブル式) を使用して最初に null の end_dates を取得し、それに対して左結合を実行します。使用している任意の日付をハードコードする必要がなくなります。

追加のクエリが必要なため、最初のソリューションよりも遅くなります。

そのため、最適なソリューションを決定する際に、レコードの数とこのスクリプトが呼び出される頻度にも依存します。

;WITH NULL_END_DATES_CTE AS (SELECT CODE FROM SAMPLE WHERE END_DATE IS NULL)
SELECT  S.CODE,
    MIN(S.START_DATE) AS START_DATE,
    CASE WHEN C.CODE IS NULL THEN MAX(S.END_DATE) ELSE NULL END AS END_DATE
FROM    SAMPLE S
LEFT JOIN NULL_END_DATES_CTE C ON C.CODE = S.CODE 
GROUP BY S.CODE,C.CODE
ORDER BY S.CODE
于 2012-11-30T06:09:17.977 に答える