首页
学习
活动
专区
圈层
工具
发布

T-SQL问题
EN

Stack Overflow用户
提问于 2009-06-15 05:22:36
回答 5查看 294关注 0票数 0

我有下表(SQL Server)表名是LandParcels

代码语言:javascript
复制
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

块No (数字)=用于地籍地图编号的前6位数字和用于区块编号的后2位数字

例如: 110019是地形图编号,01是地块编号。

我使用了以下查询

代码语言:javascript
复制
select substring(ltrim(str(blockid)),1,6) as blockid,stateorprivate, count(*) as noofLP from LandParcels group by blockid, stateorprivate order by blockid asc

结果是

代码语言:javascript
复制
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

我想为一份报告获得以下结果

代码语言:javascript
复制
blockid  noofBlocks   Deemana   State  Private  Amt_of_Deemana_State_Private
110019    2            3          3       3          9  
110020    2            2          2       2          6

如何查询。请帮帮我。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-15 05:51:21

你可以这样做:

代码语言:javascript
复制
SELECT 
    SUBSTRING(LTRIM(STR(Blockid)), 1, 6) AS blockid,
    COUNT(DISTINCT SUBSTRING(LTRIM(STR(Blockid)), 7, 2)) AS noofBlocks,
    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],
    SUM(CASE Stateorprivate
        WHEN 'Deemana' THEN 1
        WHEN 'State' THEN 1
        WHEN 'Private' THEN 1
        ELSE 0
    END) AS Amt_of_Deemana_State_Private
FROM LandParcels
GROUP BY SUBSTRING(LTRIM(STR(Blockid)), 1, 6)

但是,如果数据库架构在您的控制之下,则应考虑规范化。

票数 1
EN

Stack Overflow用户

发布于 2009-06-15 05:45:01

我不打算检查这是否有效,但您应该考虑使用sum和case。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2009-06-15 05:33:39

您可以开始查询:

代码语言:javascript
复制
select substring(ltrim(str(blockid)),1,6) as blockid

这立即给DB带来了歧义--在查询的其余部分中,blockid代表的是该名称的原始列,还是同义的这个列?

不会这样做 --重载一个DB引擎而使其处理的歧义更多是荒谬的;在这里使用as myblockid或其他任何东西,在查询的其余部分中使用myblockid,当就是您想要的时候。这可能不能解决所有问题,但它将使您的生活、DB引擎以及任何试图帮助您解决问题的人的生活不再是噩梦。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/994582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档