【发布时间】:2017-12-15 19:36:37
【问题描述】:
使用 T-SQL 的 SQL Server 2014。
在我们的数据库中,客户有问题(!),分配给客户的每个问题在我正在查询的表中都有一个单独的行。
我希望为这些问题中的每一个(以及其他一些信息)创建一个单行,但目前,我的每个 CASE 语句都创建一个单行。
所以输出是这样的(我已经更改了一些标题名称,以便它们适合这里):
Prod Date Time Cust Lname Fname Street 1 S2 City Zip Email CSI Action Dog Prog TourHeadsets
Tosca 08-Apr-17 2:30 PM 122253 Smith Michael 33 Rodeo Drive NULL Beverley Hills 90210 msmith@email.com NULL NULL 0 None 0 1
Tosca 08-Apr-17 2:30 PM 122253 Smith Michael 33 Rodeo Drive NULL Beverley Hills 90210 msmith@email.com NULL NULL 0 Large 0 0
Tosca 08-Apr-17 2:30 PM 122253 Smith Michael 33 Rodeo Drive NULL Beverley Hills 90210 msmith@email.com NULL NULL 0 None 2 0
Tosca 08-Apr-17 2:30 PM 125634 Brown Sarah 22 Victory Drive NULL Beverley Hills 90210 sbrown@email.com NULL NULL 0 Large 0 0
Tosca 08-Apr-17 2:30 PM 125634 Brown Sarah 22 Victory Drive NULL Beverley Hills 90210 sbrown@email.com NULL NULL 0 None 2 0
Tosca 08-Apr-17 2:30 PM 125634 Brown Sarah 22 Victory Drive NULL Beverley Hills 90210 sbrown@email.com NULL NULL 0 None 0 2
但我想要这个(4 个 CASE 语句的结果在同一行的不同列中):
Prod Date Time Cust Lname Fname Street 1 S2 City Zip Email CSI Action Dog Prog Tour Headsets
Tosca 08-Apr-17 2:30 PM 122253 Smith Michael 33 Rodeo Drive NULL Beverley Hills 90210 msmith@email.com NULL NULL 0 Large print 2 1
Tosca 08-Apr-17 2:30 PM 125634 Brown Sarah 22 Victory Drive NULL Beverley Hills 90210 sbrown@email.com NULL NULL 0 Large print 2 2
对新手有什么帮助吗?! (也非常欢迎对代码提供任何其他反馈。我对此完全陌生。)这是我一直使用的代码:
USE impresario
SELECT
g.description AS 'Production'
,CONVERT(varchar,f.perf_dt,106) AS 'Date'
,FORMAT(CAST(f.perf_dt AS DATETIME),'h:mm tt') AS 'Time'
,a.customer_no AS 'Customer'
,b.lname AS 'Last name'
,b.fname AS 'First name'
,c.street1 AS 'Street 1'
,c.street2 AS 'Street 2'
,c.city AS 'City'
,c.postal_code AS 'Postal code'
,d.address
,a.notes AS 'CSI notes'
,e.notes AS 'Action notes'
,CASE h.id
WHEN 14 THEN '1'
WHEN 15 THEN '2'
ELSE '0'
END
AS 'Dogs'
,CASE h.id
WHEN 16 THEN 'Large print'
WHEN 17 THEN 'Braille'
ELSE 'None'
END
AS 'Programmes'
,CASE h.id
WHEN 18 THEN '1'
WHEN 19 THEN '2'
ELSE '0'
END
AS 'Touch tour'
,CASE h.id
WHEN 20 THEN '1'
WHEN 21 THEN '2'
ELSE '0'
END
AS 'Headsets'
FROM T_CUST_ACTIVITY a
JOIN T_CUSTOMER b ON b.customer_no=a.customer_no
JOIN T_ADDRESS c ON c.customer_no=a.customer_no
JOIN T_EADDRESS d ON d.customer_no=a.customer_no
JOIN T_ISSUE_ACTION e ON e.activity_no=a.activity_no
JOIN T_PERF f ON f.perf_no=a.perf_no
JOIN T_INVENTORY g ON g.inv_no=f.prod_season_no
JOIN TR_ACTION h ON h.id=e.action
WHERE a.activity_type=21 --'Access requirements' from TR_CUST_ACTIVITY_TYPE
AND c.primary_ind='Y' --Primary addresses only
AND d.primary_ind='Y' --Primary emails only
AND e.action IN
(
14 --Dog x1
,15 --Dog x2
,16 --Programme (large print)
,17 --Programme (braille)
,18 --Touch tour x1
,19 --Touch tour x2
,20 --Headset x1
,21 --Headset x2
)
ORDER BY f.perf_dt, a.customer_no ASC
【问题讨论】:
-
看起来您的
TR_ACTION表可能返回了多行。检查您的数据并查看哪些行被重复。此外,我更喜欢将我的 JOIN 条件放在实际的 JOIN 中,而不是在 where 中。即JOIN T_ADDRESS c ON c.customer_no = a.customer_no AND c.primary_ind='y'。在 JOIN 之外有一个条件将在您的 ON 条件下将 tableA 连接到 tableB,然后根据您的 WHERE 删除行。这会使连接的数据更大,有时会导致返回意外的行,尤其是在 OUTER JOIN 中。以集合的形式考虑您的数据会有所帮助。 -
这对 JOIN 非常有帮助 - 谢谢。它在视觉上看起来也不那么混乱。就像你说的那样,在集合中思考它肯定会有所帮助。关于多行,该表确实为每个操作/问题都有一行,我猜这就是为什么它们在查询中作为单独的行出现。理想情况下,我想以一种我将其描述为 Excel 数据透视表的新手方式将这些行与共同点(客户)合并,然后将每个操作/问题放在其右侧的不同单元格中。
-
查询的更新取决于你在不同场景下想要做什么的很多条件。当 Michael smith 有另一排(第 4 排)prog = braille、dog = 1、touch tour = 1 和耳机 = 2 时,你想显示什么?您想合并成 2 行吗?这里的选择标准是什么?
-
有了轴心,你必须知道你希望你的最终结构是什么样子。但正如 CuriousKid 所说,如果返回的行数超过 2 行怎么办?如果您只需要子查询中的 1 个结果,则可以使用 ROW_NUMBER() 窗口函数或 TOP 1 或类似的东西来确保每条基本记录只返回一行。
-
感谢您的意见。我希望将当前 CASE 场景中返回的任何数据合并为每个客户 1 行。因此,每个客户的狗/耳机/旅行/节目组合是什么并不重要;只是它们被包含在合并线上的狗/耳机/旅游/节目单元格中,如果这有意义的话。
标签: sql tsql case sql-server-2014