![](/img/trans.png)
[英]SQL get row value where count of rows for that row value matches with of the column of that row-value
[英]SQL using CASE in SELECT with GROUP BY. Need CASE-value but get row-value
所以基本上有1個問題和1個問題:
1.問題 - 當我在一個表中有100列(並且沒有設置鍵或uindex)並且我想加入或者選擇該表時,我是否真的必須寫出每個列名?
2.問題 - 下面的例子顯示了1.問題和我的實際SQL語句問題
例:
A.FIELD1,
(SELECT CASE WHEN B.FIELD2 = 1 THEN B.FIELD3 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD1
(SELECT CASE WHEN B.FIELD2 = 2 THEN B.FIELD4 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD2
FROM TABLE A
GROUP BY A.FIELD1
故事是:如果我沒有將CASE放入其自己的select語句中,那么我必須將實際的rowname放入GROUP BY中,而GROUP BY不會將CASE中的NULL值分組,而是將實際值從行。 因此,我必須加入或選擇所有列,因為沒有鍵,沒有uindex,或者以某種方式找到另一種解決方案。
DBServer是DB2。
現在用語言和沒有SQL來描述它:我有“訂單項”,可以分為“ZD”和“EK”(1 = ZD,2 = EK),可以按“經銷商”分組。 即使“訂單商品”可以具有兩個不同的“部分”(ZD,EK)中的一個,但“ZD”和“EK”的字段/行始終都被填充。 我需要分組來考慮“離開”,並且只有當指定的“部門”(ZD或EK)正在改變時,我才想要創建一個新的組。
SELECT
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END) AS ZD,
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END) AS EK,
TABLE.DISTRIBUTOR,
sum(TABLE.SOMETHING) AS SOMETHING,
FROM TABLE
GROUP BY
ZD
EK
TABLE.DISTRIBUTOR
TABLE.DEPARTEMENT
這在GROUP BY中的SELECT和ZD,EK中有效。 唯一的問題是,即使EK不是指定的DEPARTEMENT,如果它改變了,它仍然會打開一個新組,因為他使用的是真正的EK值而不是CASE中的NULL,因為我已經在解釋頂部。
在這里,女士們,先生們是問題的解決方案:
SELECT
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END) AS ZD,
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END) AS EK,
TABLE.DISTRIBUTOR,
sum(TABLE.SOMETHING) AS SOMETHING,
FROM TABLE
GROUP BY
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END),
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END),
TABLE.DISTRIBUTOR,
TABLE.DEPARTEMENT
@t-clausen.dk:謝謝!
@其他: ...
實際上有一個通配符相等測試。 我不確定你為什么要按field1分組,這在你的例子中似乎是不可能的。 我試着把它放到你的問題中:
SELECT FIELD1,
CASE WHEN FIELD2 = 1 THEN FIELD3 END AS CASEFIELD1,
CASE WHEN FIELD2 = 2 THEN FIELD4 END AS CASEFIELD2
FROM
(
SELECT * FROM A
INTERSECT
SELECT * FROM B
) C
UNION -- results in a distinct
SELECT
A.FIELD1,
null,
null
FROM
(
SELECT * FROM A
EXCEPT
SELECT * FROM B
) C
對於無法比較的數據類型,這將失敗
不,沒有通配符相等測試。 您必須列出要單獨測試的每個字段。 如果您不想測試每個字段,可以使用諸如連接所有字段之類的黑客,例如
WHERE (a.foo + a.bar + a.baz) = (b.foo + b.bar + b.az)
但不管怎樣,你列出了所有的字段。
我可能傾向於解決這樣的問題
WITH q as
(SELECT
Department
, (CASE WHEN DEPARTEMENT = 1 THEN ZD
WHEN DEPARTEMENT = 2 THEN EK
ELSE null
END) AS GRP
, DISTRIBUTOR
, SOMETHING
FROM mytable
)
SELECT
Department
, Grp
, Distributor
, sum(SOMETHING) AS SumTHING
FROM q
GROUP BY
DEPARTEMENT
, GRP
, DISTRIBUTOR
如果您需要查找TableA中與TableB匹配的所有行,那么INTERSECT或INTERSECT DISTINCT怎么樣?
select * from A
INTERSECT DISTINCT
select * from B
但是,如果您只想要A中的行,其中整行與B中的行中的值匹配,那么為什么您的示例代碼從A獲取某些值,而從B中獲取其他值? 如果行匹配所有列,那么這似乎毫無意義。 (也許你的問題可以更全面地解釋一下?)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.