好的,假设您的初始代码确实适合您 - 下面将解决第二个查询的问题
SELECT
c1.ZIPCode AS ZIPCode,
c1.Company1 AS Company1,
c2.Company2 AS Company2,
c3.Company3 AS Company3
FROM (
SELECT ZIPCode, SUM(SumHouseholds1) AS Company1
FROM (
SELECT ZIPCode, SUM(Households) OVER (PARTITION BY ZIPCode, DBAName) AS SumHouseholds1
FROM Business
JOIN Location
ON Location.ZIPCode = Business.ZIPCode
WHERE DBAName='Company1'
GROUP BY DBAName, ZIPCode, Households)
) AS c1
JOIN (
SELECT ZIPCode, SUM(SumHouseholds2) AS Company2
FROM (
SELECT ZIPCode, SUM(Households) OVER (PARTITION BY ZIPCode, DBAName) AS SumHouseholds2
FROM Business
JOIN Location
ON Location.ZIPCode = Business.ZIPCode
WHERE DBAName='Company2'
GROUP BY DBAName, ZIPCode, Households)
) AS c2
ON c1.ZIPCode = c2.ZIPCode
JOIN (
SELECT ZIPCode, SUM(SumHouseholds3) AS Company3
FROM (
SELECT ZIPCode, SUM(Households) OVER (PARTITION BY ZIPCode, DBAName) AS SumHouseholds3
FROM Business
JOIN Location
ON Location.ZIPCode = Business.ZIPCode
WHERE DBAName='Company3'
GROUP BY DBAName, ZIPCode, Households)
) AS c3
ON c1.ZIPCode = c3.ZIPCode
但是即使现在它可以工作(我希望因为我根本没有测试过它)它太重且难以管理
下面解决了这个问题(仍然没有经过测试,但应该可以工作,至少应该给你一个想法)
SELECT
ZIPCode,
SUM(CASE WHEN DBAName='Company1' THEN Company ELSE 0 END) AS Company1,
SUM(CASE WHEN DBAName='Company2' THEN Company ELSE 0 END) AS Company2,
SUM(CASE WHEN DBAName='Company3' THEN Company ELSE 0 END) AS Company3
FROM (
SELECT ZIPCode, DBAName, SUM(SumHouseholds1) AS Company
FROM (
SELECT ZIPCode, SUM(Households) OVER (PARTITION BY ZIPCode, DBAName) AS SumHouseholds
FROM Business
JOIN Location
ON Location.ZIPCode = Business.ZIPCode
GROUP BY DBAName, ZIPCode, Households)
)
GROUP BY ZIPCode
2016 年 7 月 12 日更新,基于 cmets 中的更多信息
SELECT
ZIPCode,
SUM(CASE WHEN DBAName='Company1' THEN Company ELSE 0 END) AS Company1,
SUM(CASE WHEN DBAName='Company2' THEN Company ELSE 0 END) AS Company2,
SUM(CASE WHEN DBAName='Company3' THEN Company ELSE 0 END) AS Company3
FROM (
SELECT ZIPCode, DBAName, SUM(SumHouseholds) AS Company
FROM (
SELECT ZIPCode, DBAName, SUM(Households) OVER (PARTITION BY ZIPCode, DBAName) AS SumHouseholds
FROM Business
JOIN Location
ON Location.ZIPCode = Business.Market
GROUP BY DBAName, ZIPCode, Households
)
GROUP BY DBAName, ZIPCode
)
GROUP BY ZIPCode
输出是
ZIPCode Company1 Company2 Company3
10001 5 5 5
10016 8 8 8
12345 17 17 17
16420 10 0 0
进一步的想法
上面的“修复”仍然完全依赖于假设你的逻辑是正确的。
我确实有填充它不是:
我认为以下调整使其更正:
首先 - 按家庭分组看起来非常可疑,在查看您的笔记后,我认为您需要在下面
SELECT
ZIPCode,
SUM(CASE WHEN DBAName='Company1' THEN Company ELSE 0 END) AS Company1,
SUM(CASE WHEN DBAName='Company2' THEN Company ELSE 0 END) AS Company2,
SUM(CASE WHEN DBAName='Company3' THEN Company ELSE 0 END) AS Company3
FROM (
SELECT ZIPCode, DBAName, SUM(Households) AS Company
FROM (
SELECT Market, DBAName
FROM AS Business
GROUP BY Market, DBAName
) AS Business
JOIN Location
ON Location.ZIPCode = Business.Market
GROUP BY DBAName, ZIPCode
)
GROUP BY ZIPCode
这反过来 - 可以进一步简化为
SELECT
ZIPCode,
SUM(CASE WHEN DBAName='Company1' THEN Households ELSE 0 END) AS Company1,
SUM(CASE WHEN DBAName='Company2' THEN Households ELSE 0 END) AS Company2,
SUM(CASE WHEN DBAName='Company3' THEN Households ELSE 0 END) AS Company3
FROM (
SELECT Market, DBAName
FROM Business
GROUP BY Market, DBAName
) AS Business
JOIN Location
ON Location.ZIPCode = Business.Market
GROUP BY ZIPCode
不知何故,我的感觉 - 最后一个查询就是您要查找的内容!
但它仍然是一个选项,我只是不知道您真实的一些细节 - 很可能更复杂 - 用例,所以在这种情况下,您的原始逻辑可能是正确的