sql-server - 当 SQL 中的组合没有数据时创建空行
问题描述
大多数人可能会问过这个问题,我也尝试过,但找不到解决方案。我有一个包含 15 个非度量属性/列和 15 个度量列的表。对于非度量列 - 如果任何组合不存在,我想创建空值。我正在使用 SAS,它可以有简单的 PROC SQL 语句。假设我有这样的数据: 在此处输入图像描述
Name | Location | Holiday | Time | DishCnt | TastedGood
Bill 1st Fl. Easter AM 3 Yes
Bill 1st Fl. Easter PM 3 Yes
Bill 1st Fl. Kawanza AM 2 Yes
Bill 2st Fl. Kawanza AM 2 Yes
Sameer 1st Fl. Easter AM 1 No
Sameer 1st Fl. Easter PM 2 Yes
Sameer 1st Fl. Kawanza AM 1 Yes
Peter 1st Fl. Easter AM 1 No
Peter 1st Fl. Kawanza AM 2 No
我想检查每个非测量行的组合,如果没有,那么我想创建一个新行并将其设置为 null 或 0。 在此处输入图像描述 我想要的示例数据如下所示:
Name | Location | Holiday | Time | DishCnt | TastedGood
Bill 1st Fl. Easter AM 3 Yes
Bill 1st Fl. Easter PM 3 Yes
Bill 1st Fl. Kawanza AM 2 Yes
Bill 2st Fl. Kawanza AM 2 Yes
Sameer 1st Fl. Easter AM 1 No
Sameer 1st Fl. Easter PM 2 Yes
Sameer 1st Fl. Kawanza AM 1 Yes
Sameer 2st Fl. Kawanza AM NULL NULL
Peter 1st Fl. Easter AM 1 No
Peter 1st Fl. Kawanza AM 2 No
Peter 1st Fl. Easter PM NULL NULL
Peter 2st Fl. Kawanza AM NULL NULL
我所做的代码是我尝试交叉加入同一个表并加入公共列。像这样的东西
SELECT *
FROM Holidays H
CROSS JOIN Holidays T
LEFT JOIN Holidays R ON H.HoludayKey = R.HolidayKey AND T.TimeKey=R.TimeKey
提前感谢您的帮助。
谢谢!
解决方案
考虑名称、位置、假日和时间的所有可能值的交叉连接数据集。LEFT JOIN
然后使用实际数据集运行此查询。任何不匹配的行都将被填充NULL
或丢失。
proc sql;
CREATE TABLE combns AS
SELECT n.Name
, m.Location
, m.Holiday
, m.Time
FROM
(SELECT DISTINCT Name
FROM Holidays) n
CROSS JOIN
(SELECT DISTINCT Location, Holiday, Time
FROM Holidays) m;
CREATE TABLE final_table AS
SELECT c.Name
, c.Location
, c.Holiday
, c.Time
, h.DishCnt
, h.TastedGood
FROM combns c
LEFT JOIN Holidays h
ON c.Name = h.Name
AND c.Location = h.Location
AND c.Holiday = h.Holiday
AND c.Time = h.Time;
quit;
输入 (OP 发布的数据)
data Holidays;
infile datalines delimiter=',' DSD;
length Name $8 Location $8 Holiday $8 Time $2 DishCnt TastedGood $3;
input Name Location Holiday Time DishCnt TastedGood;
datalines;
Bill,1st Fl.,Easter,AM,3,Yes
Bill,1st Fl.,Easter,PM,3,Yes
Bill,1st Fl.,Kawanza,AM,2,Yes
Bill,2st Fl.,Kawanza,AM,2,Yes
Sameer,1st Fl.,Easter,AM,1,No
Sameer,1st Fl.,Easter,PM,2,Yes
Sameer,1st Fl.,Kawanza,AM,1,Yes
Peter,1st Fl.,Easter,AM,1,No
Peter,1st Fl.,Kawanza,AM,2,No
;
输出 (上面运行后proc sql
)
推荐阅读
- gradle - gradle maven 发布插件:无法通过“发布”上传 zip
- django - CreateView 错误 NOT NULL 约束失败:members_experience.CustomUser_id
- flutter - Flutter 中类似 Laravel 的路由模式
- r - 从句子转换器创建对象时 GPU 内存泄漏
- java - 快速提问,为什么我的指数有上限?
- loopback - 如何将服务注入 Loopback JS 中的其他服务?
- c# - Entity Framework 3.1 一对多插入数据
- java - Sparkcontext 在侦听器内停止
- python - 使用单个刮板获取多个产品的数据
- vue.js - Vuetify:带有字符串数组的数据表