0

次のテーブルがあります(SQL Server)テーブル名はLandParcelsです

Blockid   ParcelNo  Stateorprivate
========================
11001901   30       Deemana
11001901   35       Deemana
11001901   41       State
11001901   45       State
11001901   110      Private
11001901   111      Private

11001902   1        Deemana
11001902   11       State
11001902   16       Private

11002001   15       Deemana
11002001   16       State
11003001   20       Private
11002003   2        Deemana
11002003   3        State
11003003   4        Private

Blockid (数値) = Cadastral Map No に使用される最初の 6 桁と Block No の最後の 2 桁

例: 110019 は Cadastal マップ番号、01 はブロック番号です。

次のクエリを使用しました

select substring(ltrim(str(blockid)),1,6) as blockid,stateorprivate, count(*) as noofLP from LandParcels group by blockid, stateorprivate order by blockid asc

結果は

Blockid  Stateorprivate  noofLP
========================
110019   Deemana         2
110019   State           2
110019   Private         2
110019   Deemana         1
110019   State           1
110019   Private         1
110020   Deemana         1
110020   State           1
110020   Private         1
110020   Deemana         1
110020   State           1
110020   Private         1

レポートの次の結果を取得したい

blockid  noofBlocks   Deemana   State  Private  Amt_of_Deemana_State_Private
110019    2            3          3       3          9  
110020    2            2          2       2          6

これを照会する方法。助けてください。

4

5 に答える 5

2

これが機能するかどうかを確認するつもりはありませんが、sum と case の使用を検討する必要があります。

select
substring(ltrim(str(blockid)),1,6) as blockid,
sum(case stateorprivate when 'Deemana' then 1 else 0 end) as Deemana,
sum(case stateorprivate when 'State' then 1 else 0 end) as State,
sum(case stateorprivate when 'Private' then 1 else 0 end) as Private,
count(*) as Amt_of_Deemana_State_Private
from LandParcels group by blockid 
order by blockid asc
于 2009-06-15T05:45:00.937 に答える
1

クエリを開始します。

select substring(ltrim(str(blockid)),1,6) as blockid

これはすぐにDBにあいまいさを与えます-クエリの残りの部分では、blockidその名前の元の列を表しますか、それともこの同名の列を表しますか?

そうしないでください-- DB エンジンに、対処しなければならない以上のあいまいさを加えてオーバーロードするのはばかげています。as myblockidここでまたは何でも使用し、それが意味するmyblockid場合はクエリの残りの部分で使用します。これですべての問題が解決するわけではありませんが、あなたの人生、DB エンジンの人生、そしてあなたを助けようとしている人の人生を悪夢から遠ざけることができます。

于 2009-06-15T05:33:38.530 に答える
0

このようなもの?

SELECT substring(ltrim(str(lp.blockid)),1,6) as blockid, 
    w.noofBlocks
    x.Deemana,
    y.State,
    z.Private,
    COUNT(*) AS Amt_of_Deemana_State_Private
FROM LandParcels lp
    INNER JOIN (
        SELECT substring(ltrim(str(lp.blockid)),1,6) as myblockid, COUNT(*) AS Deemana
        FROM LandParcels lp2
        WHERE Stateorprivate = 'Deemana'
    ) x ON (substring(ltrim(str(lp.blockid)),1,6) = x.myblockid)
    INNER JOIN (
        SELECT substring(ltrim(str(lp.blockid)),1,6) as myblockid, COUNT(*) AS State
        FROM LandParcels lp3
        WHERE Stateorprivate = 'State'
    ) y ON (substring(ltrim(str(lp.blockid)),1,6) = y.myblockid)
    INNER JOIN (
        SELECT substring(ltrim(str(lp.blockid)),1,6) as myblockid, COUNT(*) AS Private
        FROM LandParcels lp4
        WHERE Stateorprivate = 'Private'
    ) z ON (substring(ltrim(str(lp.blockid)),1,6) = z.myblockid)
    CROSS JOIN (
        SELECT COUNT(DISTINCT substring(ltrim(str(lp.blockid)),1,6) as myblockid)
        FROM LandParcels lp5
    ) w
GROUP BY substring(ltrim(str(lp.blockid)),1,6)
于 2009-06-15T05:56:29.737 に答える
0

NoOfBlocks フィールドが 2 列目ではなく 1 列目であることを除けば、このクエリで目的の結果が得られると思います。また、ブロック ID という名前が既に他にあるため、あいまいさが追加されたという Alex Martelli からの提案に基づいて、結果セットの列名に blockid の代わりに CadastalMapNo を使用しました。NoOfBlocks フィールドを最初の列として配置した理由は、distinct キーワードが使用されている場合、SQLServer がカウント関数を選択リストの最初のフィールドにする必要があると考えているためです。

これを実際にテストしたことはなく、パフォーマンスが低下する可能性がありますが、質問を理解しているので、正しいと確信しています。

    SELECT
        COUNT(DISTINCT SUBSTRING(LTRIM(STR(blockid)),7,8)) as NoOfBlocks,
        SUBSTRING(LTRIM(STR(blockid)),1,6) as CadastalMapNo, 
        (CASE WHEN Stateorprivate='Deemana' then 1 else 0 end) as Deemana,
        (CASE WHEN Stateorprivate='State' then 1 else 0 end) as State,
        (CASE WHEN Stateorprivate='Private' then 1 else 0 end) as Private,
        COUNT(*) as Amt_of_Deemana_State_Private 
    FROM 
        LandParcels
    GROUP BY 
        CadastalMapNo
    ORDER BY
        CadastalMapNo
于 2009-06-15T06:00:14.550 に答える