我是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查询中看起来可能略有不同。
答案 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
子句中的记录数。在这种情况下,每个[年份],[种族]和[类型]的记录计数