0

私は SQL を初めて使用し、その使用時間は限られているので、親切にしてください。以前にプログラムを作成し、NPR でコードを書いたことがありますが、SQL の基本的な知識はあります。SQL は別の種類の獣になる可能性があります。私は実践することで学ぶのが好きで、ここ数日間これにつまずいており、大きな銃を呼ぶ時が来ました! 私は StackOverflow で多くの投稿を読みましたが、あなたのコミュニティが協力して、できない (またはしたくない) 人々の解決策を見つける方法が本当に気に入りました。とにかく、必要なデータを取得するために必要な要件を考えることはできません。私は多数の投稿に目を通し、サブクエリ、その他の DISTINCT、および yuet に関するいくつかの取引を読みましたが、私が抱えている問題を解決できるものを見たことはありません。次の例外を除いて、すべて正常に動作します。

  1. サブクエリの愚かな列ヘッダーを印刷することができません。
  2. 返信と日付を含む 1 つのアカウントのみを表示するルールがわかりません。
  3. #2 の分子を数えます 大きなものは #2 です

ルール: 1. 日付範囲内でいくつのアカウントが表示されても、所有できるアカウントは 1 つだけです。2. 訪問の反応を記録する必要があります。1 つの反応がある場合は、それを分子に追加し、その特定の日付を取得します。応答が「1」のさまざまな日付は問題ではありません。そのうちの 1 つだけをキャプチャしてください。たとえば、同じ UnitNumber を持つ 5 つのアカウントがあり、3 つのアカウントが "1" の応答を持ち、2 つのアカウントが "0" の応答を持っている場合、"1" の 1 つだけをその日付で取得し、分子を増やします。それ以外の場合、それらがすべて 0 の場合、勘定科目の 1 つだけが表示されますが、分子は増加しません。3. 回答の日付を取得する必要があります。

たとえば、M000003206 の下のアカウントは 1 回だけ表示され、応答値は日付が 01/03/13 の 1 で、分母は 13 である必要があります。

*M000003206 1 1/03/2011 should show up in the data, and populate numerator *M000003206 0 1/04/2011 should not show up in the data, and not be in the denominator or the numerator.

NOTES: - The "response" is a field that tracks a bunch of queries 6000 or so. The C.AD.DOCS section can have 5 answers which I dont care about I just want to see if they responded to any of them, if so throw in a 1; if no answer response is a 0. - I havent written the numerator part as I have no idea how to make the rule to limit the account to only show 1 visit - Also I am getting a No column name listed and I've looked but I cant seem to find how to correct this in a sub-query

The numerator (once written) should be 7, for all the responses that are 1.

BTW: I have changes Unit Numbers and admit dates to protect confidential data.

Thank you for any replies!

OUTPUT-------------------------------------------------------------

Denominator 14

UnitNumber no column name no column name

M000001058 1 1/04/2011

M000004955 0 1/03/2011

M000006362 1 1/03/2011

M000006211 1 1/03/2011

M000004212 0 1/03/2011

M000009850 1 1/03/2011

M000003047 0 1/04/2011

*M000003206 1 1/03/2011*

*M000003206 0 1/04/2011*

M000002526 0 1/04/2011

M000000538 1 1/04/2011

M000003813 0 1/03/2011

M000004473 1 1/04/2011

M000004794 1 1/03/2011

        Should be   Should be 
        Response    AdmitDate

CODE-------------------------------------------------------------------

    use livedb
    DECLARE @StartDate DateTime,
    @EndDate DateTime

    SET @StartDate = '1/03/2011 00:00:00.000'
    SET @EndDate =   '1/05/2011 00:00:00.000'
    SELECT DISTINCT COUNT(UnitNumber) AS Denominator
    FROM AbstractData 
    WHERE (AbstractData.AdmitDateTime BETWEEN @StartDate and @EndDate) 
            and (AbstractData.BirthDateTime < '1946-09-29 00:00:00.000') 
            and (AbstractData.PtStatus IN ('IN','INO')) 
    SELECT DISTINCT AbstractData.UnitNumber AS UnitNumber,
    (SELECT MAX(CASE WHEN AbsQueriesMult.GroupResponse = 'C.AD.DOCS' THEN 1 ELSE 0 END) AS Response 
    FROM AbsQueriesMult WHERE AbstractData.AbstractID =  AbsQueriesMult.AbstractID),
    (SELECT CONVERT(VARCHAR(12),AbstractData.AdmitDateTime,101) AS AdmitDate)
    FROM AbstractData 
    WHERE (AbstractData.AdmitDateTime BETWEEN @StartDate and @EndDate) 
            and (AbstractData.BirthDateTime < '1946-09-29 00:00:00.000') 
            and (AbstractData.PtStatus IN ('IN','INO')) 
    ORDER BY UnitNumber

4

1 に答える 1

0

最初に簡単な問題に取り組みます。サブクエリにラベルを付ける構文は次のとおりです。

select (subquery) as label1, (subquery) as label2

あなたの例では、それは次のとおりです。

SELECT DISTINCT AbstractData.UnitNumber AS UnitNumber,
(SELECT MAX(CASE WHEN AbsQueriesMult.GroupResponse = 'C.AD.DOCS' THEN 1 ELSE 0 END) 
FROM AbsQueriesMult WHERE AbstractData.AbstractID =  AbsQueriesMult.AbstractID) AS Response,
CONVERT(VARCHAR(12),AbstractData.AdmitDateTime,101) AS AdmitDate
FROM AbstractData 
WHERE (AbstractData.AdmitDateTime BETWEEN @StartDate and @EndDate) 
        and (AbstractData.BirthDateTime < '1946-09-29 00:00:00.000') 
        and (AbstractData.PtStatus IN ('IN','INO')) 
ORDER BY UnitNumber

SELECTまた、不要なので AdmitDate からも削除しました。クエリからいくつかのものを削除するだけです。

紛らわしい部分です。

私があなたの問題だと思うことを要約させてください。あなたはテーブル/ビュー/何でもAbstractDataを持っています。AbstractData には多くのフィールドがありますが、質問にとって最も興味深いのは、AdmitDateTime、UnitNumber、および計算フィールド Response です。すべての UnitNumbers を一覧表示する必要があります。各 UnitNumber について、いずれかの行に 1 がある場合は Response を 1 にし、それ以外の場合は 0 にします。これらすべての UnitNumbers から、合計数を分母にし、1 の数を分子にします。

ですので、段階的にやると良いと思います。最初のステップでは、その計算フィールド Response と AdmitDate ですべての行を装飾します。

SELECT AbstractData.UnitNumber AS UnitNumber,
(SELECT MAX(CASE WHEN AbsQueriesMult.GroupResponse = 'C.AD.DOCS' THEN 1 ELSE 0 END) 
FROM AbsQueriesMult WHERE AbstractData.AbstractID =  AbsQueriesMult.AbstractID) AS Response,
SELECT CONVERT(VARCHAR(12),AbstractData.AdmitDateTime,101) AS AdmitDate
FROM AbstractData 
WHERE (AbstractData.AdmitDateTime BETWEEN @StartDate and @EndDate) 
        and (AbstractData.BirthDateTime < '1946-09-29 00:00:00.000') 
        and (AbstractData.PtStatus IN ('IN','INO')) 

このクエリは、すべての重複を取得します。次に、重複を削除します。

そのために、行を UnitNumber で分割します。各 UnitNumber 内で、Response DESC を並べます。各グループからの最初の応答のみが必要です。

残念ながら、これは簡単な操作ではありません。クエリが TSQL のように見えるため、SQL Server を使用していることを願っています。2005+ for を使用していることも期待していますROW_NUMBER。まず、パーティション内のランクで各行にラベルを付けます。次に、最初の応答のみを選択します。

SELECT * FROM (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY UnitNumber ORDER BY Response DESC) as r
    FROM (
        SELECT AbstractData.UnitNumber AS UnitNumber,
        (SELECT MAX(CASE WHEN AbsQueriesMult.GroupResponse = 'C.AD.DOCS' THEN 1 ELSE 0 END) 
        FROM AbsQueriesMult WHERE AbstractData.AbstractID =  AbsQueriesMult.AbstractID) AS Response,
        SELECT CONVERT(VARCHAR(12),AbstractData.AdmitDateTime,101) AS AdmitDate
        FROM AbstractData 
        WHERE (AbstractData.AdmitDateTime BETWEEN @StartDate and @EndDate) 
                and (AbstractData.BirthDateTime < '1946-09-29 00:00:00.000') 
                and (AbstractData.PtStatus IN ('IN','INO'))
    ) Decorated
) Labeled
WHERE r = 1

この結果が得られたので、これを使用して分母と分子を取得する方法がいくつかあります。これを一時テーブルまたはテーブル変数に格納するか、クエリをコピーして 2 回貼り付けます。1 回ですべての行を一覧表示し、1 回で集計 (分子と分母) を実行します。また、CTE を使用してテーブルのエイリアスを作成し、返されたすべての行を分子と分母で装飾することもできます。これは多くの冗長な情報ですが、クエリ時間が短縮される可能性があります。試してみる必要があります。幸運を。

于 2013-07-24T04:43:03.683 に答える