簡體   English   中英

SQL中使用帶有GROUP BY的CASE的SQL。需要CASE值但獲取行值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM