【问题标题】:How can I consolidate results onto one line如何将结果合并到一行
【发布时间】:2018-07-26 02:33:12
【问题描述】:

我有一个查询,我正在尝试使用 SQL Server 将其合并到 1 行中。 它一直迫使我按Frequency 列分组,但我只想按UserId 分组。谁能告诉我我做错了什么。

代码:

SELECT userid, frequency,
(select count(frequency) where frequency = 1) AS Onetime,
(select count(frequency) where frequency = 2) AS Daily,
(select count(frequency) where frequency = 3) AS Weekly,
(select count(frequency) where frequency = 4) AS Fortnightly,
(select count(frequency) where frequency = 5) AS Monthly,
(select count(frequency) where frequency = 6) AS Quarterly,
(select count(frequency) where frequency = 7) AS SemiAnnual,
(select count(frequency) where frequency = 8) AS Annual
FROM AppTasks
where userid = 'userid@gmail.com'
group by UserID, Frequency

数据:

【问题讨论】:

  • 您必须在您的选择中删除frequency 列的投影。然后您可以安全地删除您组中的frequency 列。
  • 只需将frequency 从您的SELECTGROUP BY 子句中取出。
  • 所以这是我尝试的第一件事,它产生了以下错误消息: 列 'AppTasks.Frequency' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中.

标签: sql-server tsql pivot


【解决方案1】:

你能试试这个吗?

SELECT userid,
SUM(CASE WHEN frequency = 1 THEN 1 ELSE 0 END) AS Onetime,
SUM(CASE WHEN frequency = 2 THEN 1 ELSE 0 END) AS Daily,
SUM(CASE WHEN frequency = 3 THEN 1 ELSE 0 END) AS Weekly,
SUM(CASE WHEN frequency = 4 THEN 1 ELSE 0 END) AS Fortnightly,
SUM(CASE WHEN frequency = 5 THEN 1 ELSE 0 END) AS Monthly,
SUM(CASE WHEN frequency = 6 THEN 1 ELSE 0 END) AS Quarterly,
SUM(CASE WHEN frequency = 7 THEN 1 ELSE 0 END) AS SemiAnnual,
FROM AppTasks
where userid = 'userid@gmail.com'
group by UserID;

【讨论】:

  • 那行得通。太感谢了。我了解您的问题,您知道为什么我的问题不起作用吗?
  • @FuriousD 是的。您需要在分组中保留 frequency 列,否则您会收到错误,它不是分组或聚合的一部分。但是,当您在结果集中有此列时,您不能对数据进行透视,因为 userid - frequency 组合是唯一的。
【解决方案2】:

原始查询不起作用,因为 SELECT 语句包含 7 个子查询,每个子查询计数 所有 记录,其频率由外部查询返回,而不仅仅是用户的。

您可以使用PIVOT 计算特定频率数的计数并将其显示为列:

declare @apptasks table (userid nvarchar(20),frequency int)

insert into @apptasks
values
('userid@gmail.com',1),
('userid@gmail.com',2),
('userid@gmail.com',3),
('userid@gmail.com',4),
('userid@gmail.com',5),
('userid@gmail.com',6),
('userid@gmail.com',7),
('userid@gmail.com',7),
('userid@gmail.com',2),
('userid@gmail.com',1),
('userid@gmail.com',1)


select 
    userid, 
    [1] AS Onetime,
    [2] AS Daily,
    [3] AS Weekly,
    [4] AS Fortnightly,
    [5] AS Monthly,
    [6] AS Quarterly,
    [7] AS SemiAnnual
from ( select 
              userid,
              frequency 
       from @apptasks) as source
PIVOT (
    count(frequency) for Frequency in ([1],[2],[3],[4],[5],[6],[7])
) as pvt

结果是

userid            Onetime   Daily   Weekly  Fortnightly Monthly Quarterly   SemiAnnual
userid@gmail.com  3         2       1       1           1       1           2

如果您事先知道要使用哪些值,PIVOT 和 UNPIVOT 就可以工作。 PIVOT 本质上计算 IN 子句中字段(频率)值的聚合(COUNT(*)),并将它们作为以值命名的列返回。

您也可以省略频率值:

select 
    userid, 
    [1] AS Onetime,
    [2] AS Daily,
    [3] AS Weekly,
    [4] AS Fortnightly,
    [5] AS Monthly
from (select userid,frequency from @apptasks) as source
PIVOT 
(
        count(frequency) for Frequency in ([1],[2],[3],[4],[5])
) as pvt

【讨论】:

    【解决方案3】:

    只是因为您只想按 userID 分组,所以从 Select statment as next 中删除 frequency:-

    SELECT userid,
    (select count(frequency) where frequency = 1) AS Onetime,
    (select count(frequency) where frequency = 2) AS Daily,
    (select count(frequency) where frequency = 3) AS Weekly,
    (select count(frequency) where frequency = 4) AS Fortnightly,
    (select count(frequency) where frequency = 5) AS Monthly,
    (select count(frequency) where frequency = 6) AS Quarterly,
    (select count(frequency) where frequency = 7) AS SemiAnnual,
    (select count(frequency) where frequency = 8) AS Annual
    FROM AppTasks
    where userid = 'userid@gmail.com'
    group by UserID
    

    【讨论】:

    • 所以这是我尝试的第一件事,它产生了以下错误消息: 列 'AppTasks.Frequency' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中
    • 即使这样可行,它也会有与原版相同的问题。它以指定的频率计算所有行,而不仅仅是用户的
    猜你喜欢
    • 2014-01-25
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    相关资源
    最近更新 更多