如何修复一列?

时间:2015-09-03 18:11:06

标签: sql sql-server database sql-server-2008 sql-server-2012

其中有一个方案和不同的项目,因此情况是如果用户将SchemeID发送到过程,那么它应该返回SchemeName(一次)和方案内的所有项目,即DescriptionOfitem,Quantity,Rate,Amount .. 。采用这种格式

SchemeName DescriptionOfItems Quantity Unit Rate     Amount
 Scheme01      Bulbs             2       M2  200      400
               Titles            10      M3  300      3000
               SolarPanels       2       M2  1000     2000
               Bricks            50      M9  50       2500
                                             Total    7900

我的尝试,它有效,但它也重复每行的SchemeName,但找不到总数

Select
    Schemes.SchemeName, 
    ContractorsWorkDetails.ContractorsWorkDetailsItemDescription,
    ContractorsWorkDetails.ContractorsWorkDetailsUnit, 
    ContractorsWorkDetails.ContractorsWorkDetailsItemQuantity,
    ontractorsWorkDetails.ContractorsWorkDetailsItemRate,
    ContractorsWorkDetails.ContractorsWorkDetailsAmount
From ContractorsWorkDetails
Inner Join Schemes
    ON Schemes.pk_Schemes_SchemeID= ContractorsWorkDetails.fk_Schemes_ContractorsWorkDetails_SchemeID
Where ContractorsWorkDetails.fk_Schemes_ContractorsWorkDetails_SchemeID= 2

更新:

我按照下面的建议测试了查询,但它给出了这种结果

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以使用grouping sets获取总数。我建议你在每一行保留模式名称。如果您希望在某些行上过滤掉它,那么请在应用程序层执行此操作。

现在,说到这一点,我认为这将在SQL中做你想做的事情:

Select (case when GROUPING(cwd.ContractorsWorkDetailsItemDescription) = 0
             then 'Total'
             when row_number() over (partition by s.SchemeName
                                     order by cwd.ContractorsWorkDetailsItemDescription
                                    ) = 1
              then s.SchemeName else ''
        end) as SchemeName, 
       cwd.ContractorsWorkDetailsItemDescription,
       cwd.ContractorsWorkDetailsUnit, 
       cwd.ContractorsWorkDetailsItemQuantity,
       cwd.ContractorsWorkDetailsItemRate,
       SUM(cwd.ContractorsWorkDetailsAmount) as ContractorsWorkDetailsAmount
From ContractorsWorkDetails cwd Inner Join
     Schemes s
     ON s.pk_Schemes_SchemeID = cwd.fk_Schemes_ContractorsWorkDetails_SchemeID
Where cwd.fk_Schemes_ContractorsWorkDetails_SchemeID = 2
group by GROUPING SETS ((s.SchemeName, 
                         cwd.ContractorsWorkDetailsItemDescription,
                         cwd.ContractorsWorkDetailsUnit, 
                         cwd.ContractorsWorkDetailsItemQuantity,
                         cwd.ContractorsWorkDetailsItemRate
                        ), s.SchemeName)
Order By GROUPING(cwd.ContractorsWorkDetailsItemDescription),
         s.SchemeName, cwd.ContractorsWorkDetailsItemDescription;

您不希望在SQL中执行此操作的原因是因为结果集不再具有关系结构:行的排序很重要。