0

これは LEFT JOIN の使い方がわからないことが原因だと思いますが、NULL 値を返さないクエリを書いています。クエリは次のとおりです。

CREATE TABLE #OrgMaster
(OrgName nvarchar(100))

INSERT INTO #OrgMaster (OrgName)
SELECT DISTINCT Organization
FROM StageReleaseCalendar_VW

SELECT SRC.Organization
, SRC.deploytype
, COUNT(SRC.deploytype) AS 'Deployment Count'
, DATEPART(m,SRC.actualstarttime) AS 'MonthNum'
, DATENAME(m,SRC.actualstarttime) AS 'MonthNam'
 FROM #OrgMaster TTOM LEFT OUTER JOIN StageReleaseCalendar_VW SRC 
 ON LEFT(TTOM.OrgName, LEN(TTOM.OrgName)) = SRC.Organization
WHERE DATEDIFF(m, SRC.scheduledstarttime, CURRENT_TIMESTAMP) BETWEEN 1 AND 2
AND completerelease = 1
AND deploytype IN ('Service Pack','Hot Fix')
AND cancelled = 0
GROUP BY SRC.Organization, SRC.deploytype,  DATEPART(m,SRC.actualstarttime), DATENAME(m,SRC.actualstarttime)

DROP TABLE #OrgMaster

コマーシャル、コンシューマー、パートナー、セールスの合計 4 つの組織があります。一時テーブルを作成した後、次のクエリを実行すると:

#OrgMaster から OrgName を選択

結果は次のとおりです。

コマーシャル コンシューマー パートナー セールス

パートナーは 7 月または 8 月にいかなる種類の展開も行わないため、取得しようとしているのは、パートナーの 4 つの NULL レコード (7 月のホットフィックス、8 月のホットフィックス、7 月のサービス パックのレコード) を含む一連の結果です。 、および 8 月のサービス パック用。代わりに、展開が実際に行われたエントリのみに限定された結果セットを取得します。

ここで私が理解していないことを誰かが見ることができますか?

ありがとう。

4

3 に答える 3

2

問題は、where 句が (右側の) テーブルのフィールドによってデータを制限していることです。これはヌルを与えません。これを行うために、私はよく SELECT を別の SELECT (入れ子) の中に入れて、(右の) テーブルで null をクエリできるようにします。

SELECT * FROM (
SELECT a.ID as AID, b.ID as BID from TableA a
LEFT JOIN TableB b
On ....
WHERE ...
) tmp Where BID is null
于 2013-09-18T22:45:05.443 に答える
0

これはあなたのために働くでしょう。さらに、これを使用して、他の良い情報も取得できると思います。

DECLARE @OrgMaster as table(OrgName nvarchar(100),deptype nvarchar(100),MonthNum int,DeploymentCount int)
DECLARE @Loop1 int
DECLARE @Loop2 int

SELECT @Loop1 = 0, @Loop2 = 0

WHILE @Loop1 <> 2
BEGIN
    SELECT @Loop1 = @Loop1 + 1, @Loop2 = 0

    WHILE @Loop2 <> 2
    BEGIN
        SET @Loop2 = @loop2 + 1

        INSERT INTO @OrgMaster (OrgName,deptype,MonthNum)
        SELECT DISTINCT 
            Organization
            ,CASE WHEN @Loop1 = 1 THEN 'Service Pack' ELSE 'Hot Fix' END
            ,DATEPART(m,DATEADD(MONTH, -1 * @Loop2, GETDATE()))
        FROM StageReleaseCalendar_VW

    END
END


UPDATE @OrgMaster SET
    DeploymentCount = (SELECT COUNT(*) 
                        FROM StageReleaseCalendar_VW 
                        WHERE Organization = OrgName
                            AND deploytype = deptype
                            AND DATEPART(m,actualstarttime) = MonthNum
                            )

SELECT * from @OrgMaster where DeploymentCount = 0
于 2013-09-19T16:13:33.033 に答える