SQL Server |找出数量和类别

问题描述 投票:1回答:2

表A.

Owner   row_no   category
-------------------------
A        1         U
B        1         T
B        2         T
C        1         U
C        2         T
C        3         U
C        4         U

我正在寻找一种解决方案,将值存储到应该检索的其他表中

  1. 如果值为1,则row_no为1,如果值不为1,则应返回max(row_no)-1。
  2. 根据业主是否在表A中仅选择了T或U或两者,类别应为T或U或两者。

预期的表输出应该如下所示。

Owner   row_no   category
---------------------------
A        1         U
B        1         T
C        3        Both

我尝试使用以下方法,结果证明是一个错误。

SELECT * 
INTO B 
FROM A
WHERE ROW_NO LIKE CASE
                     WHEN ROW_NO = 1 THEN ROW_NO
                                     ELSE MAX(ROW_NO) - 1
                  END

尚未想出检索该类别!

你能帮忙解决一下吗?

sql-server sql-server-2008
2个回答
3
投票

你的逻辑对我来说并不完全清楚。特别是,我假设您报告row_no的逻辑是当所有者的最大值为1时返回1,否则返回该最大值减1。

我们可以尝试在这里做一个简单的聚合查询来生成你想要的东西。

SELECT
    Owner,
    CASE WHEN MAX(row_no) = 1 THEN 1 ELSE MAX(row_no) - 1 END AS row_no,
    CASE WHEN COUNT(DISTINCT category) > 1 THEN 'Both' ELSE MAX(category) END AS category
FROM tableA
GROUP BY
    Owner;

enter image description here

Demo


2
投票

一种方法是使用GROUP BY

WITH VTE AS(
    SELECT *
    FROM(VALUES ('A',1,'U'),
                ('B',1,'T'),
                ('B',2,'T'),
                ('C',1,'U'),
                ('C',2,'T'),
                ('C',3,'U'),
                ('C',4,'U')) V([Owner], Row_no, Category))
SELECT [Owner],
       ISNULL(NULLIF(MAX(Row_no) - 1,0),1) AS Row_no,
       CASE WHEN MIN(Category) = MAX(Category) THEN MAX(Category) ELSE 'Both' END AS Category --Assumes Category cannot have a value of NULL
FROM VTE
GROUP BY [Owner];
© www.soinside.com 2019 - 2024. All rights reserved.