I有一个查询,列出了以下列:
repid
,Car
,Model
,Fault
和cnt
(事件计数)。我查询的当前输出看起来像这样:
Query:SELECT repid, Car, Model, Fault, COUNT(*) AS cnt
FROM Cars
GROUP BY repid, Car, Model, Fault
ORDER BY repid, Car, Model, COUNT(*) DESC;
电流输出:repid | Car | Model | Fault | cnt
-----------------------------------------------
1 | Car1 | Model1 | Text1 | 5
1 | Car1 | Model1 | Text2 | 4
1 | Car1 | Model1 | Text3 | 3
1 | Car1 | Model2 | Text4 | 2
1 | Car1 | Model2 | Text5 | 1
2 | Car2 | Model1 | Text6 | 6
2 | Car2 | Model1 | Text7 | 4
我希望输出更像报告,
repid
,
Car
和Model
仅出现一次,每组仅出现一次,其余的行仅显示Fault
和cnt
。例如:theSiled的输出是每个报告的文本:
Report: RepID 1
-----------------
Car 1
Model 1
Fault1 repeated Cnt1 times
Fault2 repeated Cnt2 times
Fault3 repeated Cnt3 times
Model 2
Fault4 repeated Cnt4 times
Fault5 repeated Cnt5 times
Car 2
Model 3
Fault6 repeated Cnt6 times
Fault7 repeated Cnt7 times
Model 4
Fault8 repeated Cnt8 times
Fault9 repeated Cnt9 times
中的Reps表中样本数据:
there是样本
Reps
Cars
Repid2 | |
null | |
表: |
模型FAULT
ROW_NUMBER()
CASE
表达式来隐藏repid
Car
Model
这部分有效,但没有给我我想要的东西。是否有更好的方法将SQL查询结果格式化以实现此报告式输出?
任何帮助将不胜感激!谢谢!1 | car1 | Model1 | |
---|---|---|---|
text2 | 1 | ||
Model1 | |||
text4 | 1 | car1 | |
2 | car2 | Model1 | |
我尝试使用 | 和 | ||
, | 和 | 的重复值,但是我正在努力地完全按照我的意愿获取输出。这是使用CTE的一次尝试: | WITH RankedData AS (
SELECT
repid,
Car,
Model,
Fault,
COUNT(*) AS cnt,
ROW_NUMBER() OVER (PARTITION BY repid, Car, Model ORDER BY COUNT(*) DESC) AS row_num
FROM Cars
GROUP BY repid, Car, Model, Fault
)
SELECT
CASE WHEN row_num = 1 THEN CAST(repid AS VARCHAR) ELSE '' END AS RepID,
CASE WHEN row_num = 1 THEN Car ELSE '' END AS Car,
CASE WHEN row_num = 1 THEN Model ELSE '' END AS Model,
Fault AS Fault,
cnt AS Count
FROM RankedData
ORDER BY repid, Car, Model, cnt DESC;
|
GROUPING SETS
和某些条件来完成。
GROUPING()
函数将返回1如果列进行了汇总,则否则为0。由于您想在最终分组中重复排行的行数,因此不完全分组的行更有意义,因此我们将PK添加到最终的分组集中。
SELECT repid, Car, Model, Fault, COUNT(*) AS cnt
CASE
WHEN GROUPING(Car) = 1 THEN
CONCAT('Report: RepID
-----------------', repid)
WHEN GROUPING(Model) = 1 THEN
CONCAT('Car ', Car)
WHEN GROUPING(Fault) = 1 THEN
CONCAT(' Model ', Model)
ELSE
CONCAT(' ', Fault)
END
FROM Cars
GROUP BY GROUPING SETS (
(repid),
(repid, Car),
(repid, Car, Model),
(repid, Car, Model, Fault, YourPrimaryKey)
)
ORDER BY
repid,
GROUPING(Car) DESC,
Car,
GROUPING(Model) DESC,
Model,
GROUPING(Fault) DESC,
COUNT(*) OVER (PARTITION BY repid, Car, Model, Fault) DESC;