SQL-计算列类别

时间:2018-12-11 22:26:34

标签: sql sql-server reporting-services

我是SQL的新手,但是我试图创建一个报告,在该报告中我可以统计学生每年购买的食物以及种族/民族和食物选择的分类。

例如:

         2012                                          2013
Student Vegetarian     Meat           Unknown          Vegetarian     Meat           Unknown
---------------------------------------------------------------------------
Black    5 Purchases   4 Purchases      3 Purchases      5 Purchases   etc
White    4 Purchases   3 Purchases      3 Purchases      etc           etc
Asian    4 Purchases   1 Purchases      6 Purchases      etc           etc

虽然我能够将比赛归为一列,但我对获得不同食品类别的计数感到迷惑。我所知道的是,对于素食,肉类和未知购买,pur_type分为“蔬菜”,“我”和“ Ukt”。

这是我想要做的:

select 
     DATEPART(YYYY,pur_date) AS Year
    ,count (*) Citations
    , race
    , sex
    , ethnicity
    , GETDATE() as YTD
    ,COUNT(CASE WHEN pur_type = 'Veg' THEN 'Vegetarian' 
    WHEN pur_type = 'Me' THEN 'Meat' 
    WHEN pur_type  = 'UKt' THEN 'Unknown'  

         ELSE ''

         End as "Type"

, CASE 
    WHEN race='W' and sex='M' and ethnicity <> 'H' THEN 'Caucasian(Male)' 
    WHEN race='W' and sex='F' and ethnicity <> 'H' THEN 'Caucasian(Female)' 
    WHEN race='B' and sex='M' and ethnicity <> 'H' THEN 'African-American(Male)' 
    WHEN race='B' and sex='F' and ethnicity <> 'H' THEN 'African-American(Female)' 
    --WHEN race='A' and sex='M' and ethnicity <> 'H' THEN 'Pacific Islander(Male)' 
    --WHEN race='A' and sex='F' and ethnicity <> 'H' THEN 'Pacific Islander(Female)' 
    WHEN race='A' and sex='M' and ethnicity <> 'H' THEN 'Asian(Male)'  
    WHEN race='A' and sex='F' and ethnicity <> 'H' THEN 'Asian(Female)' 



    ELSE '' 
END as 'Race' 




from purchase
join purcharge
on purchase.purchaseid = purcharge.purchaseid
where pur_date between @startDate and  dateadd(DD, +1,  GETDATE())
and pur_type in ('Veg', 'Me', 'UKt')
GROUP BY DATEPART(YYYY,pur_date), race, sex, ethnicity , pur_type
ORDER BY 'Year','Race/Sex'

正在寻找指导。我想也许可以使用子查询,也可以使用更多的案例陈述,但是我无法统计每个族裔的学生购买了多少种食品。

此外,我正尝试在SSRS报告中获得这些结果,因此在SQL查询中看起来可能略有不同。

3 个答案:

答案 0 :(得分:0)

您可以查看PIVOT语句,但是如果是我,我会做更多的情况…………然后再按GROUP BY。

所以,而不是

let Source = OData.Feed("https://localhost/odata", null, [Implementation="2.0", ApiKeyName = "ApiKey"]), Table_table = Source{[Name="Table",Signature="table"]}[Data] in Table_table

我愿意

COUNT(CASE WHEN pur_type = 'Veg' THEN 'Vegetarian' (etc) AS Type

答案 1 :(得分:0)

这实际上并不是创建报告的最佳方法,但是如果您需要使用SQL(而不是使用另一层代码从一堆数据子集中生成报告),则可以使用子查询。没有看到表结构,很难编写查询,但是可能是这样的:

Select
    race
    , (select count(*) from purchase where pur_type = 'Veg' and race = race) as Vegetables
    , (select count(*) from purchase where pur_type = 'Me' and race = race) as Meat
    , (select count(*) from purchase where pur_type = 'UKt' and race = race) as Unknown
From purchase

就像我说的那样,这不是理想的选择,但是它将获得您不同的数据子集。

答案 2 :(得分:0)

我不知道您的数据是什么样子,还没有时间来构建示例数据,但是我认为您实际上只有一两个错字。

SELECT 
     DATEPART(YYYY,pur_date) AS [Year]
    ,count (*) Citations
    , race
    , sex
    , ethnicity
    , GETDATE() as YTD
    , COUNT(*) AS [PurchaseCount]
    , CASE 
        WHEN pur_type = 'Veg' THEN 'Vegetarian'
        WHEN pur_type = 'Me' THEN 'Meat'
        WHEN pur_type  = 'UKt' THEN 'Unknown'
        ELSE ''
    End as [Type]
, CASE 
    WHEN race='W' and sex='M' and ethnicity <> 'H' THEN 'Caucasian(Male)' 
    WHEN race='W' and sex='F' and ethnicity <> 'H' THEN 'Caucasian(Female)' 
    WHEN race='B' and sex='M' and ethnicity <> 'H' THEN 'African-American(Male)' 
    WHEN race='B' and sex='F' and ethnicity <> 'H' THEN 'African-American(Female)' 
    --WHEN race='A' and sex='M' and ethnicity <> 'H' THEN 'Pacific Islander(Male)' 
    --WHEN race='A' and sex='F' and ethnicity <> 'H' THEN 'Pacific Islander(Female)' 
    WHEN race='A' and sex='M' and ethnicity <> 'H' THEN 'Asian(Male)'  
    WHEN race='A' and sex='F' and ethnicity <> 'H' THEN 'Asian(Female)' 
    ELSE '' 
END as [Race] 
FROM purchase
JOIN purcharge
    ON purchase.purchaseid = purcharge.purchaseid
WHERE pur_date BETWEEN @startDate AND dateadd(DD, +1,  GETDATE())
    AND pur_type in ('Veg', 'Me', 'UKt')
GROUP BY DATEPART(YYYY,pur_date), race, sex, ethnicity , pur_type
ORDER BY [Year],[Race], [Type]

这并不能完全满足您的要求,因为它在[Race]案例中包括种族和性别,但这也许正是您真正想要的,我不知道...

无论如何,我真正改变的只是count(*)为[PurchaseCount],下一行的CASE语句和GROUP BY子句。 COUNT(*)只会为您提供GROUP BY子句中的记录数。在这种情况下,每个[年份],[种族]和[类型]的记录计数